Python项目和包目录布局

Joe*_*Joe 11 python packages

我在python中创建了一个项目,我很好奇如何在python中使用包.

这是我的目录布局:

top-level dir
  \ tests
    __init__.py 
  \ examples
    __init__.py
    example.py
module.py
Run Code Online (Sandbox Code Playgroud)

我将如何在我的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__))) )
Run Code Online (Sandbox Code Playgroud)

我认为这也不是一个合适的解决方案.

我觉得我错过了python包的一些基本部分.我在python 2.6上测试它.如果需要进一步说明,请告诉我.

Wal*_*ndt 9

Python包非常简单:包是sys.path中具有__init__.py文件的任何条目下的任何目录.但是,如果通过相对导入(例如import package.moduleor)导入模块,则该模块仅被视为包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])
Run Code Online (Sandbox Code Playgroud)

然后你的例子可以做"导入模块".

或者,如果module.py还要包含在软件包中,请将"顶级目录"的PARENT添加到sys.path,然后使用from .. import module示例模块中的语法.另外,将第一个参数更改为__import__包装器中的"tldname.examples",其中tldname是顶级目录的名称.

如果您不想依赖"示例运行器"模块,则每个示例都需要sys.path样板,或者您需要PYTHONPATH设置.抱歉.