如何让PyPI自动安装依赖项

时间:2019-07-22 18:12:36

标签: python scikit-learn pip pypi

如何在PyPI上发布软件包,以便自动安装所有依赖项,而不是由用户手动安装。

我用setup.pyinstall_requires中指定依赖项,如下所示:

setuptools.setup(name='myPackage',
    version='1.0',
    packages=setuptools.find_packages(),
    include_package_data=True,
    classifiers=[
        'Programming Language :: Python :: 3',
        'Operating System :: OS Independent',
        'Topic :: Scientific/Engineering :: Bio-Informatics'
                ],
    install_requires=['numpy', 'pandas', 'sklearn'],
    python_requires='>=3'
        )

我有一个requirements.txt文件,该文件包含在我的MANIFEST.in中:

numpy==1.15.4
sklearn==0.20.1
pandas==0.23.4

但是,当我尝试安装软件包时在test.pypi上发布后,出现以下错误:

Could not find a version that satisfies the requirement numpy (from myPackage==1.0.0) (from versions: )
No matching distribution found for sklearn (from myPackage==1.0.0)

这意味着PyPI不会安装numpy依赖项。 如何启用自动安装依赖项? 构建和发布程序包时,我应该使用虚拟环境吗?我该怎么做?

P.S。我是新手,所以我将欣赏显式代码或指向简单教程页面的链接。谢谢。

5 个答案:

答案 0 :(得分:2)

这是TestPyPI的不幸(众所周知)的缺点:问题是sklearn在TestPyPI上不存在,并且通过从那里安装软件包,您告诉pip查找依赖项在那里。

相反,您应该改为发布到PyPI,并使用预发行版本,以免污染您的版本。您可以稍后从项目中删除这些预发行版。

答案 1 :(得分:1)

您可以通过--extra-index-url指定多个索引。将其指向TestPyPI,以便从那里拉出您的包裹,从PyPI提取您的包裹:

$ pip install myPackage --extra-index-url=https://test.pypi.org/simple/

但是,此问题的真正根源是您为scikit-learn软件包输入了错误的dist名称。将sklearn替换为scikit-learn

setup(
    ...,
    install_requires=['numpy', 'pandas', 'scikit-learn'],
)

答案 2 :(得分:0)

您的install_requires的格式应为

...
install_requires=["numpy==1.15.4",
                  "sklearn==0.20.1",
                  "pandas==0.23.4"]
...

您也可以使用>=而不是==来允许这些库的最新版本。

答案 3 :(得分:0)

我意识到pip从test.PyPI安装软件包不会安装依赖项,因为这些依赖项托管在PyPI上,而不是test.PyPI。

当我在PyPI上以预发行版(1.0a1)发行软件包时,正确安装了依赖项。因此,问题完全出在test.PyPI。

答案 4 :(得分:0)

这是我的方法。

我喜欢使用requirements.txt文件,而不是将依赖项放在install_requires中,因为在开发过程中运行起来更容易:

$ pip install -r requirements.txt

要让pip自动安装依赖项,我在setuptools.setup()之前包含在setup.py的顶部:

requirements = []
with open('requirements.txt', 'r') as fh:
    for line in fh:
        requirements.append(line.strip())

然后在setuptools.setup()中:

install_requires = requirements

要安装:

pip install --index-url https://test.pypi.org/simple/ --upgrade --no-cache-dir --extra-index-url=https://pypi.org/simple/ <<package name>>

-index-url 告诉pip使用pypi的测试版本。

如果安装了以前的版本,

-upgrade 会强制升级。

-no-cache-dir 解决了如果进行快速重新发布(pip无法获取新版本)的缓存问题

-extra-index 告诉pip如果无法在测试中找到所需的程序包,则在pypi的生产版本中查找(即解决了测试中不存在依赖项的问题)