我的项目层次结构(Python 3.5):
/home/pavarine/Projects/brp (project root)
config.py
main.py
lib/
Class1.py
我试图将我的项目(brp文件夹)动态转换为python包并从我想要的任何地方调用它的模块,如下所示:
执行' main.py':
sys.path.insert(0, "/home/pavarine/Projects/brp")
print('\n'.join(sys.path))
这让我:
/home/pavarine/Projects/brp
/home/pavarine/Projects/brp
/usr/lib/python35.zip
/usr/lib/python3.5
/usr/lib/python3.5/plat-x86_64-linux-gnu
/usr/lib/python3.5/lib-dynload
/home/pavarine/.local/lib/python3.5/site-packages
/usr/local/lib/python3.5/dist-packages
/usr/lib/python3/dist-packages
我可以清楚地看到我的项目根路径现在位于sys.path中,但是当我尝试导入" config.py"我收到了一个错误:
执行' main.py':
from brp import config
结果:
ImportError: No module named 'brp'
我做错了什么?
答案 0 :(得分:3)
您需要将父目录插入到python路径中。
但是,请不要这样做。从脚本内部操作python路径可能很危险,使用绝对路径会使其无法移植。
对于您的项目,创建另一个名为brp
的文件夹,并在那里创建一个简单的setup.py
。
看起来应该是这样的
/home/pavarine/Projects/brp (project root)
setup.py
brp/
__init__.py # can be empty
config.py
main.py
lib/
__init__.py # can be empty
Class1.py
首先,setup.py
可以像
from setuptools import setup, find_packages
setup(
name='brp',
packages=find_packages(),
)
然后,您可以从根文件夹安装包含pip install .
的软件包,并在系统的任何位置使用它,而无需操作sys.path
。
如果需要,可以使用pips开发人员模式:pip install -e .
,这只会创建符号链接,以便项目目录中的更改直接生效,而无需重新安装包。
答案 1 :(得分:1)
通常,您可以通过两种方式中的一种来构建项目。
根文件夹中有一个模块
brp/
brp.py
或者您有多个模块放在一个子文件夹中:
mymod/
mymod/
__init__.py
a.py
b.py
最简单的解决方案是在现有brp
中添加brp
子文件夹,并移动该子文件夹中的所有内容。导致:
brp/
brp/
__init__.py
config.py
main.py
lib/
__init__.py
Class1.py
__init__.py
文件是如此python知道这些是子模块。有关详细信息,请参阅多个指南,包括此one。