Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否真的可以使用不同的约定来布局源目录而不破坏包内引用?_Python_Pip_Distutils - Fatal编程技术网

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

Python 是否真的可以使用不同的约定来布局源目录而不破坏包内引用?,python,pip,distutils,Python,Pip,Distutils,假设您正在处理一个python包。以下是包的结构(以分层文件系统表示): Distutils用于构建、分发和安装软件包。在安装脚本中,可以告诉Distutils关于我的布局源目录的约定(请参阅)。简言之,我要说: package_dir = {'packagename', 'src'} 但是,例如,module1a需要以绝对导入方式导入module2a时会出现问题(请参阅)。简言之,我会把模块1A: import src.module2a 一旦使用pip分发和安装软件包,一个简单的: imp

假设您正在处理一个python包。以下是包的结构(以分层文件系统表示):

Distutils用于构建、分发和安装软件包。在安装脚本中,可以告诉Distutils关于我的布局源目录的约定(请参阅)。简言之,我要说:

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