在 python 中的 setup.py 中根据用户及其偏好(动态)安装要求

Install requirements based on users and their preferences (dynamic) in setup.py in python

我已经实现了使用 pip install 命令安装要求的代码,没有任何问题。为了不给用户安装不必要的包,需要向他们提问(输入)并根据他们的回答安装包。

这是我当前的 setup.py 文件,它工作完美但安装了所有软件包:

setuptools.setup(
    name="backbone",
    version="1",
    entry_points={
        "console_scripts": [
            'backbone_cli=backbone.backbone:main'
        ]
    },
    author="Mostafa Ghadimi",
    author_email="<my_email>",
    long_description=long_description,
    long_description_content_type="text/markdown",
    install_requires=requirements,
    include_package_data=True,
    url="https://github.com/mostafaghadimi/backbone",
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    packages=setuptools.find_packages(),
    python_requires=">=3.6",
    license='MIT',
)

举个例子,假设我们想询问用户 he/she 是否要安装 numpy。我试过 does_need_numpy = input('Do you want to install numpy? [y]es/[n]o') 但它不起作用,当我将它添加到 setup.py 时,当我想安装软件包 (pip install <package_name>) 时遇到以下错误:

File "/tmp/pip-req-build-ldgfq6l6/setup.py", line 11, in <module>
        does_need_numpy = input('Do you want to install numpy? [y]es/[n]o')
    EOFError: EOF when reading a line

正如我所发现的,有一些函数(例如 cmdclass install)可能是解决方案。

谁能帮我实现预期的功能?

感谢@phd 的评论。正如我所发现的,没有任何方法可以使用 pip install 命令根据用户输入以交互方式安装要求。所以为了满足需要,我们不得不使用extras_require.

setuptools.setup 函数中添加 extras_require 作为参数后问题得到解决。

setuptools.setup(
    name="backbone",
    version="1",
    entry_points={
        "console_scripts": [
            'backbone_cli=backbone.backbone:main'
        ]
    },
    author="Mostafa Ghadimi",
    author_email="<my_email>",
    long_description=long_description,
    long_description_content_type="text/markdown",
    install_requires=requirements,
    include_package_data=True,
    url="https://github.com/mostafaghadimi/backbone",
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    packages=setuptools.find_packages(),
    python_requires=">=3.6",
    license='MIT',
    extras_require={
        'pandas_numpy': [
            'numpy',
            'pandas_numpy',
        ]
    },
)

并且可以在虚拟环境下使用以下命令本地安装。

pip install git+https://$GITLAB_USERNAME:$GITLAB_PASSWORD@$GITLAB_URL[pandas_numpy]

欲了解更多信息并找出 install_requiresextras_require checkout 之间的区别,请阅读此 link。