【问题标题】:How can I include the parent folder structure on a library distribution in Python 3.6 using setuptools?如何使用 setuptools 在 Python 3.6 中的库分发中包含父文件夹结构?
【发布时间】: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,或者,如果您使用pippip 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


【解决方案1】:

我找到了问题的解决方案。它与 package_dir 的配置方式有关:

    package_dir={'': '.'}

虽然上面的 package_dir 按预期构建了文件并包含了所有子文件夹,但 egg-info 文件的 SOURCES.txt 不正确并显示如下:

    ./prod-library/__init__.py
    ./prod-library/package1/__init__.py
    etc...

将包导入另一个 API 时,尝试 import prod-libary.package1.file.py 时找不到导入

如下更改package_dir后,我可以正常使用该库了:

    package_dir={'.': ''}

以上内容有效地删除了 SOURCES.txt 文件中破坏导入的 ./ 前缀。现在 egg-info 的 SOURCES.txt 看起来是正确的:

    prod-library/__init__.py
    prod-library/package1/__init__.py
    etc...

【讨论】:

    猜你喜欢
    • 2020-08-20
    • 1970-01-01
    • 2018-08-03
    • 2012-05-14
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 2010-10-04
    相关资源
    最近更新 更多