【问题标题】:Inconsistent behaviour of bdist vs sdist when distributing a Python package分发 Python 包时 bdist 与 sdist 的行为不一致
【发布时间】:2016-02-19 17:12:48
【问题描述】:

我有一个具有以下结构的大项目。 utilities 是由 big_projectproject1、2 等的不同组件在各个地方重用的小模块的集合。 p>

big_project/
|-- __init__.py
|-- utilities/        
    |-- mod1.py
    |-- mod2.py
|-- project1/
    |-- setup.py
    |-- __init__.py
    |-- src/
        |-- __init__.py
        |-- mod1.py
        |-- mod2.py
    |-- examples/
        |-- __init__.py
        |-- mod.py
|-- project2/
   |-- ...
|-- project3/
   |-- ...

我想分发project1,包括utilities(因为我不想单独分发utilities)。分发包将具有以下结构:

project1/
    |-- utilities/
    |-- src/
    |-- examples/

project1/setup.py 看起来像这样:

setup(
    name = 'project1',
    packages = ['project1.utilities', 'project1.src', 'project1.examples'],
    package_dir = {'project1.utilities': '../utilities/',
                   'project1.src': 'src',
                   'project1.examples': 'examples'}
     )

问题:python setup.py bdist 生成具有正确结构的分布,但 python setup.py sdist 没有:

bdistproject1-0.1.linux-x86_64.tar.gz的内容:

    /./usr/local/lib/python2.7/site-packages/
        |-- project1/
            |-- utilities
            |-- src
            |-- examples

sdistcontent of project1-0.1.tar.gz

    project1/
        |-- src/
        |-- examples/

所以 sdist 省略了实用程序模块,而 bdist 将它包含在正确的位置。为什么?

如果有人想查看真实项目:https://testpypi.python.org/pypi/microscopy,其中 bsdist 和 sdist 存档都可用。

setuptools 和 distutils 产生相同的结果。因为项目是纯Python,我宁愿用sdist...

【问题讨论】:

  • 我现在已经达到了这个水平。看起来 sdist 命令从字面上处理 setup.py 中的相对路径。如果您查看 setyp.py sdist 的控制台日志,您会看到通过 .. 引用的子目录被复制到 build/.. 中!!!因此它们不包含在最终的 tar 或 zip 中。惊人的。我们应该提交错误吗?

标签: python setuptools distutils setup.py


【解决方案1】:

似乎可行的一种方法是使用 bdist_wheel,尽管它的名称是纯 Python,但它会产生与平台无关的源代码分发。轮子应该是新标准。

setup.py也需要告知根包project1,否则project1.__init__.py会丢失:

setup(
      name = 'project1',
      packages = ['project1'
                  'project1.utilities',
                  'project1.src',
                  'project1.examples'],
      package_dir = {'project1': '.',
                     'project1.utilities': '../utilities/',
                     'project1.src': 'src',
                     'project1.examples': 'examples'}
 )

然后

 python2.7 setup.py bdist_wheel

【讨论】:

    【解决方案2】:

    我建议更新您的 MANIFEST.in 文件以包含实用程序文件夹
    例如递归包含 ../utilities *

    【讨论】:

      猜你喜欢
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-20
      • 2018-09-28
      • 2019-03-10
      相关资源
      最近更新 更多