Python项目和包目录布局

时间:2011-02-03 01:36:43

标签: python packages

我在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上测试它。如果需要进一步澄清,请告诉我。

2 个答案:

答案 0 :(得分:9)

Python包非常简单:包是sys.path中具有__init__.py文件的任何条目下的任何目录。但是,如果通过import package.modulefrom 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)