在setup.py中的备选依赖项(回退)

10

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

是否有一种方法可以指定install_requires=["pyobdc"]setuptools.setup 并在前一个包未安装的情况下回退到pypyodbc ?

更新:我对于这个特定情况的解决方案:

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]
      )

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


我认为你的方法没有问题。根据文档,这看起来是有效的。https://pythonhosted.org/setuptools/setuptools.html#declaring-dependencies - rh0dium
3个回答

10

做你已经在做的事情似乎是一个常见的建议,但由于这个问题是这类问题的谷歌热门搜索结果,我想指出install_requires支持一个相当复杂的小语言,该语言在PEP 508中有详细说明:

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

在一个相关问题的评论中, 用户Marius Gedminas指出,在代码中计算install_requires可能会有一些负面影响,因此应优先选择上述方法以避免该问题。

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


2
到目前为止,我还没有找到任何关于Debian软件包中类似于foo || bar语法的规范或实际示例,以表明您想要安装foobar中的任何一个。 - tripleee

0

你的解决方案是针对这种情况的正确方法。目前来说,这是实现此任务的最佳且更加灵活的方式。


-1
在设置中没有尝试A备用B。手动尝试的方法如下:
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'])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接