我正在运行Python 2.5。
这是我的文件夹树:
ptdraft/
nib.py
simulations/
life/
life.py
(我在每个文件夹中也有,为了便于阅读,这里省略了)__init__.py
如何从模块内部导入模块?我希望可以在不修补 sys.path 的情况下做到这一点。nib
life
注意:正在运行的主模块位于文件夹中。ptdraft
您可以使用相对导入(python >= 2.5):
from ... import nib
(Python 2.5 中的新增功能)PEP 328:绝对和相对进口
编辑:添加了另一个点“.”以上升两个包
我也发布了类似的答案,关于从兄弟姐妹包裹进口的问题。你可以在这里看到它。
sys.path
packaged_stuff
)setup.py
pip install -e <myproject_folder>
from packaged_stuff.modulename import function_name
我假设与问题中的文件夹结构相同
.
└── ptdraft
├── __init__.py
├── nib.py
└── simulations
├── __init__.py
└── life
├── __init__.py
└── life.py
我调用根文件夹,在我的情况下,它位于 ..
C:tmptest_imports
setup.py
setup.py
from setuptools import setup, find_packages
setup(name='myproject', version='1.0', packages=find_packages())
基本上“任何”都可以。这只是一个最小的工作示例。setup.py
如果您熟悉虚拟环境,请激活一个,然后跳到下一步。使用虚拟环境不是绝对必需的,但从长远来看,它们确实会帮助你(当你有超过 1 个项目正在进行时……最基本的步骤是(在根文件夹中运行)
python -m venv venv
. venv/bin/activate
(Linux) 或 (Win)./venv/Scripts/activate
deactivate
(Linux)要了解更多信息,只需谷歌搜索“python virtualenv tutorial”或类似内容。除了创建、激活和停用之外,您可能永远不需要任何其他命令。
创建并激活虚拟环境后,控制台应在括号中给出虚拟环境的名称
PS C:tmptest_imports> python -m venv venv
PS C:tmptest_imports> .venvScriptsactivate
(venv) PS C:tmptest_imports>
使用 安装顶级软件包。诀窍是在进行安装时使用标志。这样,它以可编辑状态安装,对.py文件所做的所有编辑将自动包含在已安装的包中。myproject
pip
-e
在根目录中,运行
pip install -e .
(注意点,它代表“当前目录”)
您还可以看到它是通过使用pip freeze
(venv) PS C:tmptest_imports> pip install -e .
Obtaining file:///C:/tmp/test_imports
Installing collected packages: myproject
Running setup.py develop for myproject
Successfully installed myproject
(venv) PS C:tmptest_imports> pip freeze
myproject==1.0
mainfolder
在此示例中,将为 。这样做的好处是,您不会与其他模块名称(来自 python 标准库或第三方模块)发生名称冲突。mainfolder
ptdraft
def function_from_nib():
print('I am the return value from function_from_nib!')
from ptdraft.nib import function_from_nib
if __name__ == '__main__':
function_from_nib()
(venv) PS C:tmptest_imports> python .ptdraftsimulationslifelife.py
I am the return value from function_from_nib!
相对导入(如 中所示)仅在包中起作用。
要导入当前模块父目录中的“mymodule”,请执行以下操作:from .. import mymodule
import os
import sys
import inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0, parentdir)
import mymodule
编辑:并不总是给出属性。我现在建议不要使用检查模块来检索当前文件的文件名(和路径),而不是使用__file__
os.path.abspath(__file__)
模板简介:该模板名称为【Python从父文件夹导入模块】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Python】栏目查找您需要的精美模板。