关于从同级包导入的问题,我也发布了类似的答案。你可以看到here。
没有sys.path hacks的解决方案
总结
- 将代码打包到一个文件夹中(例如
packaged_stuff)
- 在您使用setuptools.setup() 的地方创建一个
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:\tmp\test_imports。
步骤
- 将
setup.py 添加到根文件夹
--
setup.py的内容可以很简单
from setuptools import setup, find_packages
setup(name='myproject', version='1.0', packages=find_packages())
基本上“任何”setup.py 都可以。这只是一个最小的工作示例。
- 使用虚拟环境
如果您熟悉虚拟环境,请激活一个,然后跳到下一步。 虚拟环境的使用不是绝对 必需的,但它们会从长远来看,真的 可以帮助您(当您有多个正在进行的项目时......)。最基本的步骤是(在根文件夹中运行)
- 创建虚拟环境
- 激活虚拟环境
-
. venv/bin/activate (Linux) 或 ./venv/Scripts/activate (Win)
- 停用虚拟环境
要了解更多信息,只需谷歌搜索“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 以可编辑状态安装您的项目
使用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 方模块)的名称冲突。
示例用法
nib.py
>
def function_from_nib():
print('I am the return value from function_from_nib!')
life.py
>
from ptdraft.nib import function_from_nib
if __name__ == '__main__':
function_from_nib()
运行 life.py
>
(venv) PS C:\tmp\test_imports> python .\ptdraft\simulations\life\life.py
I am the return value from function_from_nib!