【问题标题】:Alternative dependencies (fall back) in setup.pysetup.py 中的替代依赖项(回退)
【发布时间】:2014-05-28 10:22:35
【问题描述】:

假设我想安装pyodbc。它不能在某些 Windows 机器上构建,但有一个替代方案 - pypyodbc,它是 pyobdc 的纯 python 实现。

如果没有安装以前的包,有没有办法为setuptools.setup 指定install_requires=["pyobdc"] 并回退到pypyodbc

UPD:我针对这种特殊情况的解决方案:

import sys
from setuptools import setup

if sys.platform.startswith("win"):
    pyodbc = "pypyodbc>=1.2.0"
else:
    pyodbc = "pyodbc>=3.0.7"

...

setup(
      ...
      install_requires=[pyobdc]
      )

但我仍在寻找更通用的解决方案。

【问题讨论】:

标签: python installation setuptools


【解决方案1】:

做你已经在做的事情似乎是一个普遍的建议,但由于这个问题是这类问题的热门谷歌点击,我会指出install_requires 支持相当复杂的迷你语言,它在PEP 508:

install_requires = [
    'pypyodbc>=1.2.0;platform_system=="Windows"',
    'pyodbc>=3.0.7;platform_system!="Windows"'
]

In a comment to a related question,用户Marius Gedminas 指出,在代码中计算您的install_requires 可能会产生一些不利影响,因此应首选上述方法以避免该问题。

(另一方面,https://hynek.me/articles/conditional-python-dependencies/ 感叹一些相当严重的可移植性问题,如果您必须支持旧版本的 setuptools。)

【讨论】:

  • 到目前为止,我还没有找到任何规范或实际示例,例如 Debian 软件包中的 foo || bar 语法,说明您想要安装 foobar
【解决方案2】:

对于这种情况,您的解决方案是正确的。这是目前完成这项任务的最佳且更灵活的方式。

【讨论】:

    【解决方案3】:

    setup中没有try A fallback B。手动try是这样的:

    try:
       import pyodbc# i didn't test this
    except ImportError:
       import subprocess
       import sys
       test=subprocess.run([sys.executable,'-m','pip','install','pypyodbc>=1.2.0'])
       if test.returncode:
            subprocess.run([sys.executable,'-m','pip','install','pyodbc>=3.0.7'])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-05
      • 2015-01-10
      • 1970-01-01
      • 2016-10-18
      • 2022-01-15
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多