【发布时间】:2019-02-07 13:58:25
【问题描述】:
我正在使用 setuptools 分发 Python 库。我有以下目录结构:
/src
/production
setup.py
/prod-library
/package1
/package2
文件夹结构必须保持这样,因为将来会有多个库生活在 src 下,并且需要有自己的 setup.py 文件。因此,在这种情况下,拥有 1 个父文件夹并将 setup.py 移出到根文件夹的传统答案将不起作用。
我在库的 setup.py 中使用以下内容来导出库(正在工作)
package_dir={'': '.'},
packages=find_packages()
在项目 tar.gz 中它看起来像这样:
/prod-library
/package1
/package2
但在 prod-library 包 Python 文件中,引用其他模块的导入需要如下结构:
import src.production.prod-library.package1
import src.production.prod-library.package2
问题: 将其中一个库导入到不同的项目后,会引发如下错误:
ModuleNotFoundError: No module named 'src.production'
由于构建仅包含在 /prod-library 包中,由于构建的发行版只有 /prod-library,因此缺少文件夹结构 (src/production) 导致项目导入代码失败。
我需要做的是在分发版本中包含 src/production 文件夹,因此生成的 tar.gz 文件如下所示:
/src
/production
/prod-library
/package1
/package2
我不确定如何在构建结构中获取它们,因为它们位于 setup.py 位置之上。怎么实现?
如果不能,那么我愿意接受有关修复导入的建议(如果这可以成为解决方案)。
【问题讨论】:
-
为什么不导入
import prod-library.package1呢?要在开发时修复失败的导入,请在开发模式下执行一次性安装:python src/production/setup.py develop,或者,如果您使用pip,pip install --editable src/production。通常,如果使用package_dir,您应该始终进行开发安装。此外,安装脚本通常放在项目根目录中(除非您在一个项目中开发多个包)。 -
在包中导入
import prod-library.package1时,由于目录结构为src.production.prod-library.package1且setup.py文件引用了“.”,因此找不到文件。目录(当前目录)。此外,开发模式并不能解决这里的问题。问题是最终的 .egg 文件 SOURCES.txt 具有如下文件路径:“./prod-library.package1/subpackage/__init__.py”。根据 setup.py 的结构,这是正确的,但不知道如何解决导入问题。安装脚本不能放在项目根目录下(见帖子 cmets)。
标签: python-3.x setuptools