我有点困惑。似乎有两种不同类型的Python包,源代码分发(setup.py sdist)和egg分发(setup.py bdist_egg)。
两者似乎只是具有相同数据的档案,即python源文件。一个区别是,pip
,最推荐的包管理器,无法安装鸡蛋。
两者之间的区别是什么?'分发我的包的方式是什么?
(注意,我不想通过PyPI分发我的包,但我想使用从PyPI获取依赖项的包管理器)
答案 0 :(得分:30)
setup.py sdist
创建源代码分发:它包含setup.py,模块/脚本的源文件(.py文件或.c / .cpp用于二进制模块),数据文件等。结果是一个存档,然后可以用来重新编译任何平台上的所有内容。
setup.py bdist
(和bdist_*
)创建内置发行版:它包含.pyc文件,.so / .dll / .dylib表示二进制模块,.exe表示如果使用Windows上的py2exe
,您的数据文件......但没有setup.py。结果是一个特定于平台(例如linux-x86_64
)和Python版本的存档,只需将其解压缩到文件系统的根目录即可安装(可执行文件位于/ usr / bin中) (或等效),/ usr / share中的数据文件,/ usr / lib / pythonX.X / site-packages / ...中的模块。您甚至可以构建可以使用包管理器直接安装的rpm存档。
答案 1 :(得分:13)
有两种以上不同类型的Python(分发)包。此命令列出了许多子命令:
$ python setup.py --help-commands
请注意各种不同的 bdist 类型。
一个鸡蛋是一种新的包类型,由setuptools引入,后来被标准库采用。它应该安装在sys.path
上。这不同于 sdist 包,它意味着运行setup.py install
,将每个文件复制到位并可能采取其他操作(构建扩展模块,运行包含在其中的其他任意Python代码)封装)。
是否创建sdist或egg(或wheel)与是否能够声明包具有哪些依赖项(在安装时由PyPI自动下载)无关。此依赖项功能所需的全部工作是使用 distribute (setuptools的后继者)或 distutils2 (distutils的后继者)提供的额外API来声明依赖项。 - 在Python 3.x的当前开发版本中称为打包。
https://packaging.python.org/是有关包装的更多信息的良好资源。它涵盖了声明依赖关系的一些细节(例如install_requires但不是extras_require
afaict)。