Python包结构
我有一个带有几个子包的Python包。
myproject/
__init__.py
models/
__init__.py
...
controllers/
__init__.py
..
scripts/
__init__.py
myscript.py
在myproject.scripts.myscript中,如何访问myproject.models?我试过了
from myproject import models # No module named myproject
import models # No module named models
from .. import models # Attempted relative import in non-package
我以前必须解决此问题,但我永远不记得应该怎么做。这对我来说并不直观。
-
这是正确的版本:
from myproject import models
如果失败,
ImportError: No module named foo
则是因为尚未设置PYTHONPATH
包含的目录myproject/
。恐怕其他人会建议一些技巧,让您避免设置
PYTHONPATH
。我敦促您不要理them它们。这就是PYTHONPATH
存在的原因:告诉Python在哪里寻找要加载的代码。它功能强大,文档合理,可移植到许多环境中。人们为了避免设置技巧而玩技巧并不是这些。显式相对进口 将
工作,即使没有PYTHONPATH
被设置,因为它可能只是走了目录层次结构,直到找到合适的位置,它并不需要找到顶部,然后往下走。但是,它在您作为命令行参数传递给python
(或等效地,直接用#!/usr/bin/python
一行调用)的脚本中不起作用。这是因为在这两种情况下,它都成为__main__
流程的模块。无处可走__main__
-它已经在顶部了!如果您通过
导入 该模块在脚本中调用代码,那么就可以了。也就是说,比较:python myproject/scripts/myscript.py
至
python -c 'import myproject.scripts.myscript'
您可以通过不直接执行脚本模块,而是创建一个
bin/myscript
执行导入并可能调用主函数的方法来利用此功能:import myprojects.scripts.myscript myprojects.scripts.myscript.main()
比较一下Twisted的命令行脚本的定义方式:http
:
//twistedmatrix.com/trac/browser/trunk/bin/twistd