是否真的可以使用不同的约定来布局源目录而不破坏包内引用?

时间:2014-06-01 17:55:06

标签: python pip distutils

假设您正在使用python包。这是包的结构(用分层文件系统表示):

/PackageName
    /src
        __init__.py
        /subpackage1
            __init__.py
            module1a.py
            module1b.py
        /subpackage2
            __init__.py
            module2a.py
            module2b.py
    /tests
    INSTALL
    LICENSE
    README
    setup.py

Distutils用于构建,分发和安装软件包。在设置脚本中,可以告诉Distutils关于我的约定来布置我的源目录(参见here)。总之,我会说:

package_dir = {'packagename', 'src'}

但是,例如module1a需要使用绝对导入导入module2a时出现问题(请参阅here)。简而言之,我会放入module1a

import src.module2a

使用pip分发和安装软件包后,简单:

import packagename

提出:

ImportError: No module names src.module2a

一个简单的解决方案是将src目录重命名为packagename但是(正如我的问题清楚地说明的那样)是否存在使用不同约定来布置源目录的解决方案(可能是{{1}我错过了}或distutils选项。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

使用以下方式注册您的包裹:

package_dir = {'': 'src'}

并在 packagename中创建一个src目录。您要导入packagename,而不是srcsrc本身不是一个包:

/PackageName
    /src
        /packagename
            __init__.py
            /subpackage1
                __init__.py
                module1a.py
                module1b.py
            /subpackage2
                __init__.py
                module2a.py
                module2b.py
    /tests
    INSTALL
    LICENSE
    README
    setup.py

无论如何,您可以在模块之间使用相对导入,但现在绝对导入

from package.subpackage2 import module2b

或者您可以使用相对导入:

from ..subpackage2 import module2b

现实生活中的示例项目:https://github.com/mjpieters/collective.transmogrifier