Python 是否真的可以使用不同的约定来布局源目录而不破坏包内引用?
假设您正在处理一个python包。以下是包的结构(以分层文件系统表示): Distutils用于构建、分发和安装软件包。在安装脚本中,可以告诉Distutils关于我的布局源目录的约定(请参阅)。简言之,我要说:Python 是否真的可以使用不同的约定来布局源目录而不破坏包内引用?,python,pip,distutils,Python,Pip,Distutils,假设您正在处理一个python包。以下是包的结构(以分层文件系统表示): Distutils用于构建、分发和安装软件包。在安装脚本中,可以告诉Distutils关于我的布局源目录的约定(请参阅)。简言之,我要说: package_dir = {'packagename', 'src'} 但是,例如,module1a需要以绝对导入方式导入module2a时会出现问题(请参阅)。简言之,我会把模块1A: import src.module2a 一旦使用pip分发和安装软件包,一个简单的: imp
package_dir = {'packagename', 'src'}
但是,例如,module1a
需要以绝对导入方式导入module2a
时会出现问题(请参阅)。简言之,我会把模块1A
:
import src.module2a
一旦使用pip
分发和安装软件包,一个简单的:
import packagename
提出:
ImportError: No module names src.module2a
一个简单的解决方案是将src
目录重命名为packagename
,但是(正如我的问题明确指出的那样)有没有一个解决方案来使用不同的约定来布局源目录(可能是distutils
或pip
选项我遗漏了)
提前感谢。向以下机构注册您的包裹:
package_dir = {'': 'src'}
并在src
中创建一个packagename
目录。您要导入的是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
实际项目示例:src目录不是程序包名称;它甚至不应该有
\uuuu init\uuuu.py
文件。它应该是sys.modules
搜索路径的一部分。@MartijnPieters:一般来说可能是这样,但在这种情况下,它看起来像是对src
的滥用,因为OP显然希望子包是PackageName
的子包。将src
直接放在sys.path
上意味着您可以直接在顶层导入子包,而无需通过PackageName
@BrenBarn:请参阅下面的答案,OP缺少实际的包目录。因此我只需在src
中添加一个名为packagename
的新目录,并将src
的内容放入packagename
中。就是这样?如果我正确阅读了文档,您应该能够完成您正在做的事情,但是您必须将导入更改为import packagename.module2a
。您的意思是{':'src'}
;我抄了一行,没抄到。好了,就这样。一个细节,/tests
,INSTALL
,…,setup.py
必须在/src
下,而不是/packagename
@Baptiste:ick下。我想知道packagename
的名字是否还不错。ProjectName
是否更合适?
from ..subpackage2 import module2b