假设您正在使用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
选项。
提前谢谢。
答案 0 :(得分:1)
使用以下方式注册您的包裹:
package_dir = {'': 'src'}
并在 packagename
中创建一个src
目录。您要导入packagename
,而不是src
。 src
本身不是一个包:
/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