我正在运行 Python 2.5。
这是我的文件夹树:
ptdraft/
nib.py
simulations/
life/
life.py
(我__init__.py
,为便于阅读,在此省略)
如何从life
nib
模块?我希望无需修补 sys.path 就可以做到。
注意:正在运行的主模块位于ptdraft
文件夹中。
相对导入(例如from .. import mymodule
)仅在包中起作用。要导入当前模块的父目录中的 “mymodule”,请执行以下操作:
import os,sys,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__)
而是使用 inspect 模块来检索当前文件的文件名(和路径)。
对于有关从同级软件包导入的问题,我也发表了类似的答案。你可以在这里看到它。
sys.path
hacks 的解决方案packaged_stuff
到一个文件夹中(例如 packaged_stuff)setup.py
脚本。pip install -e <myproject_folder>
以可编辑状态 pip 安装软件包from packaged_stuff.modulename import function_name
我假设与问题中的文件夹结构相同
.
└── ptdraft
├── __init__.py
├── nib.py
└── simulations
├── __init__.py
└── life
├── __init__.py
└── life.py
我打电话给.
根文件夹,在我的情况下,它位于C:\tmp\test_imports
。
setup.py
添加到根文件夹setup.py
的内容可以很简单
from setuptools import setup, find_packages
setup(name='myproject', version='1.0', packages=find_packages())
基本上,“任何” setup.py
都可以工作。这只是一个最小的工作示例。
如果您熟悉虚拟环境,请激活一个,然后跳到下一步。虚拟环境的使用不是绝对必需的,但是从长远来看(当您正在进行多个项目时) ,它们确实可以帮助您。最基本的步骤是(在根文件夹中运行)
python -m venv venv
. /venv/bin/activate
(Linux)或./venv/Scripts/activate
)要了解更多信息,只需在 Google 上搜索 “python virtualenv 教程” 或类似内容即可。除了创建,激活和停用之外,您可能根本不需要任何其他命令。
创建并激活虚拟环境后,控制台应在括号中提供虚拟环境的名称。
PS C:\tmp\test_imports> python -m venv venv
PS C:\tmp\test_imports> .\venv\Scripts\activate
(venv) PS C:\tmp\test_imports>
使用pip
安装顶级软件包myproject
。诀窍是在安装时-e
这样,它以可编辑状态安装,并且对. py 文件所做的所有编辑将自动包含在已安装的软件包中。
在根目录中,运行
pip install -e .
(注意点,它代表 “当前目录”)
您还可以通过使用pip freeze
(venv) PS C:\tmp\test_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:\tmp\test_imports> pip freeze
myproject==1.0
mainfolder
来进行导入在这个例子中, mainfolder
将ptdraft
。这样的好处是您不会与其他模块名称(来自 python 标准库或 3rd party 模块)发生名称冲突。
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:\tmp\test_imports> python .\ptdraft\simulations\life\life.py
I am the return value from function_from_nib!