如何使用 setuptools 在 Python 3.6 中的库分发中包含父文件夹结构?

How can I include the parent folder structure on a library distribution in Python 3.6 using setuptools?

我正在使用 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 包,导入代码的项目由于缺少文件夹结构而失败 (src/production),因为构建的分发版只有 /prod-library。

我需要做的是在分发版本中包含 src/production 文件夹,因此生成的 tar.gz 文件如下所示:

   /src
     /production
       /prod-library
          /package1
          /package2

我不确定如何在构建结构中获取它们,因为它们位于 setup.py 位置之上。如何实现?

如果不能,那么我愿意接受有关修复导入的建议,如果这可以作为解决方案的话。

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

    package_dir={'': '.'}

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

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

将包导入另一个 API 时,尝试导入 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...