我在 github 上开发了一个 python 包,我在 PyPi 上发布了它。它使用 安装pip install PACKAGENAME,但不会对 setup.py 文件的“install_requires”中声明的依赖项执行任何操作。
奇怪的是,相关发行版的 zip 文件确实安装了所有依赖项。
pip install pythutils如果可用,则下载一个轮子 -它可用于您的包。
生成轮子setuptools在python setup.py 本地运行但不包含setup.py在轮子中时。下载您的轮文件并解压缩它(它只是一个 zip 存档)——有您的主包目录pythutils和一个包含 metadata 的目录pythutils-1.1.1.dist-info。在元数据目录中,有一个文件METADATA通常会列出静态依赖项,但您的文件没有列出任何。因为当您生成轮子时,所有依赖项都已安装,因此所有动态代码路径都被跳过。
您从 Github release 下载的存档安装依赖项,因为它不是一个轮子,所以pip可以运行python setup.py install并且您的动态依赖项可以工作。
你可以做什么?我的建议是避免动态依赖。声明静态依赖项并允许pip决定安装哪些版本:
install_requires=[
'numpy==1.16.5; python_version>="2" and python_version<"3"',
'numpy; python_version>="3"',
],
Run Code Online (Sandbox Code Playgroud)
另一种方法是创建特定于版本的轮文件——一个用于 Python 2,另一个用于 Python 3——具有固定的依赖关系。
另一种方法是根本不发布轮子,只发布 sdist(源代码分发)。然后pip被强制python setup.py install在目标机器上运行。这不是最好的方法,对于带有 C 扩展的包肯定会有问题(用户必须有编译器和开发工具才能从源代码安装)。