我在python中创建了一个项目,我很好奇如何在python中使用包。
这是我的目录布局:
top-level dir
\ tests
__init__.py
\ examples
__init__.py
example.py
module.py
我如何在我的example.py模块中包含module.py。我知道我可以将PYTHONPATH设置为顶级目录,但这似乎不是一个好的解决方案。这就是pydev如何解决这个问题,但我想要一个不需要更新环境变量的解决方案。
我可以在example.py的顶部添加一些内容来更新sys.path,如下所示:
from os import path
import sys
sys.path.append( path.dirname(path.abspath(path.dirname(__file__))) )
我认为这也不是一个合适的解决方案。
我觉得我错过了python包的一些基本部分。我在python 2.6上测试它。如果需要进一步澄清,请告诉我。
答案 0 :(得分:9)
Python包非常简单:包是sys.path中具有__init__.py
文件的任何条目下的任何目录。但是,如果通过import package.module
或from package import module
等相对导入导入模块,则该模块仅被视为包中。请注意,这意味着通常,某人必须设置sys.path以包含您想要导入的任何包上方的目录,无论是通过PYTHONPATH
还是其他。
主要的问题是主要模块(直接从命令行运行的模块)始终是__main__
,无论它们的位置如何。因此,他们必须进行绝对导入,要么依赖PYTHONPATH设置,要么依赖于munge sys.path。
在你的情况下,我建议你设置一个小的Python脚本,在设置正确的路径后运行你的例子。假设您将其放在顶级目录中:
#!/usr/bin/env python
import sys
import os.path
sys.path.append(os.path.dirname(__file__))
example = __import__("examples", globals(), locals(), sys.argv[1])
然后你的例子可以做“导入模块”。
或者,如果module.py
也在包中,请将“顶级目录”的PARENT添加到sys.path,然后在示例模块中使用from .. import module
语法。另外,将第一个参数更改为包装器中的__import__
为“tldname.examples”,其中tldname是顶级目录的名称。
如果您不想依赖“示例运行器”模块,则每个示例都需要sys.path样板,或者您需要PYTHONPATH设置。遗憾。
答案 1 :(得分:1)
http://docs.python.org/tutorial/modules.html#intra-package-references
from .. import module