pip不安装我的软件包依赖项

时间:2019-11-15 17:08:47

标签: python pip

我在github上开发了一个python软件包,该软件包已在PyPi上发布。它与pip install PACKAGENAME一起安装,但对setup.py文件的“ install_requires”中所述的依赖项不做任何事情。

奇怪的是,相关发行版的zip文件确实安装了所有依赖项。我尝试在不同的虚拟环境和不同的计算机上使用,但从未安装过依赖项。任何帮助。

2 个答案:

答案 0 :(得分:3)

pip install pythutils下载一个转轮(如果有),并下载it's available用于您的包裹。

生成车轮时,setuptools在本地运行python setup.py ,但不将setup.py包括在车轮中。下载您的wheel file并解压缩(这只是一个zip存档)-有您的主软件包目录pythutils和一个包含元数据pythutils-1.1.1.dist-info的目录。在元数据目录中,有一个文件METADATA,该文件通常列出静态依赖性,但是您的文件未列出任何依赖性。因为当您生成转轮时,所有相关性都已安装,所以所有动态代码路径都被跳过了。

您从Github发行版下载的归档文件会安装依赖项,因为它不是一个轮子,所以pip运行python setup.py install且动态依赖项起作用。

您能做什么?我的建议是避免动态依赖性。声明静态依赖项,并允许pip决定要安装的版本:

install_requires=[
    'numpy==1.16.5; python_version>="2" and python_version<"3"',
    'numpy; python_version>="3"',
],

另一种方法是使用固定的依赖关系创建特定于版本的wheel文件-一个用于Python 2,另一个用于Python 3。

另一种方法是根本不发布轮子,而仅发布sdist(源分发)。然后,pip被迫在目标计算机上运行python setup.py install。那不是最好的方法,对于带有C扩展的软件包肯定是有问题的(用户必须具有编译器和开发人员工具才能从源代码安装)。

答案 1 :(得分:2)

Your setup.py 进行了一系列检查,例如

try:
    import numpy
except ImportError:
    if sys.version_info[0] == 2:
        install_requires.append('numpy==1.16.5')
    if sys.version_info[0] == 3:
        install_requires.append("numpy")

大概您运行的系统已安装了所有必需的模块,因此在install_requires中以空列表结尾。但这仍然是错误的方法。您应该简单地创建一个静态列表(或两个静态列表,如果您确实希望在同一软件包中同时支持两个静态列表,则分别针对Python 2和Python 3)。