Inconsistent behaviour of bdist vs sdist when distributing a Python package

一笑奈何 提交于 2020-01-06 20:02:02

问题


I have a big project with the following structure. utilities is a collections of small modules that are reused in various places by the different components of the big_project, project1, 2, etc.

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/
   |-- ...

I want to distribute project1, including utilities (because I don't want to distribute utilities separately). The distributed package would have the following structures:

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

and project1/setup.py looks like this:

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

The problem: python setup.py bdist produces a distribution with the right structure, but python setup.py sdist doesn't:

bdist: content of project1-0.1.linux-x86_64.tar.gz:

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

sdist: content of project1-0.1.tar.gz:

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

So sdist left out the utilities module, whereas bdist included it at the correct location. Why?

If anyone wants to look at the real project: https://testpypi.python.org/pypi/microscopy where both the bsdist and sdist archives are available.

Both setuptools and distutils produce the same result. Because the project is pure Python, I'd rather use sdist...


回答1:


One way that seems to work is to use bdist_wheel, which despite its name produces a platform-agnostic source distribution when the content is pure Python. And wheels are suppose to be the new standard.

setup.py also needs to be told about the root package project1, otherwise project1.__init__.py is missing:

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

and then

 python2.7 setup.py bdist_wheel



回答2:


I suggest to update your MANIFEST.in file to include utilities folder
e.g. recursive-include ../utilities *



来源:https://stackoverflow.com/questions/35510972/inconsistent-behaviour-of-bdist-vs-sdist-when-distributing-a-python-package

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!