【问题标题】:How do I specify two alternative requirements with setuptools by pip package name?如何通过 pip 包名称使用 setuptools 指定两个替代要求?
【发布时间】:2017-10-30 07:07:01
【问题描述】:

我想使用setuptools 编写一个setup.py 文件。我的包依赖于tensorflow,但是有两个不同的pip包可以满足要求,tensorflowtensorflow-gpu。如果我只是将tensorflow 放在我的setup(..., install_requires=["tensorflow"]) 中,那么如果用户在他们的系统上安装了tensorflow-gpu pip 包,则安装将失败。

imp 模块不能用于检查(如在此答案中:How to check if a python module exists without importing it),因为模块的 import 名称是 tensorflow,无论是哪个 pip 包 用户安装。那么 setuptools(以及 distutils)如何检测安装了哪个 pip 包呢?我已经挖掘了一点源,但找不到它检查的地方。

*注意,我也不打算让 setuptools 接受。我只想知道它使用什么方法来检测包,所以我可以在我的setup.py 中使用相同的方法来手动将 install_requires 参数设置为正确的版本。 (即像这样:Alternative dependencies (fall back) in setup.py

【问题讨论】:

    标签: python python-2.7 tensorflow setuptools distutils


    【解决方案1】:

    answered最近有一个类似的问题。您需要将一个 TF 与另一个区分开来。我对 TF 的了解不足以帮助详细说明,但大部分代码应该是这样的:

    kw = {}
    try:
        import tensorflow
    except ImportError:  # There is no one, declare dependency
        kw['install_requires'] = ['tensorflow']
    else:
        if is_gpu(tensorflow):
            kw['install_requires'] = ['tensorflow-gpu']
        else:
            kw['install_requires'] = ['tensorflow']
    
    setup(
        …
        **kw
    )
    

    【讨论】:

    • 是的,最后我做了这样的事情......但这不是 setuptools 正在使用的方法,因为它是特定于模块的。它是否以某种方式检查 pip 数据库?
    • 没有“pip 数据库”。我认为 setuptools 和 Co 会扫描站点包中的 *.dist-info 目录。
    • 应该注意的是,这个原本很棒的答案无法扩展到轮子,轮子无法执行这种安装时逻辑。你能做什么,嗯? setuptoolssetuptools 永不改变。
    猜你喜欢
    • 2015-08-08
    • 2023-01-21
    • 2019-05-31
    • 2022-01-05
    • 2021-09-30
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 2017-09-29
    相关资源
    最近更新 更多