我在github上开发了一个python软件包,该软件包已在PyPi上发布。它与pip install PACKAGENAME
一起安装,但对setup.py文件的“ install_requires”中所述的依赖项不做任何事情。
奇怪的是,相关发行版的zip文件确实安装了所有依赖项。我尝试在不同的虚拟环境和不同的计算机上使用,但从未安装过依赖项。任何帮助。
答案 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)。