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

2024-10-02 20:33:19 发布

您现在位置:Python中文网/ 问答频道 /正文

假设您正在处理一个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,但是(正如我的问题明确指出的那样)是否有一个解决方案可以使用不同的约定来布局源目录(可能是我错过的distutilspip选项)

先谢谢你


Tags: pippyimportsrchereinit分层布局
1条回答
网友
1楼 · 发布于 2024-10-02 20:33:19

将您的包裹注册到:

package_dir = {'': 'src'}

并在src中创建一个packagename目录。您想要导入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

相关问题 更多 >