setup.py中的替代依赖(回退)

10 投票
3 回答
1127 浏览
提问于 2025-04-18 02:40

假设我想安装 pyodbc 这个库。在某些Windows电脑上,它可能无法安装,但有一个替代方案 - pypyodbc,这是 pyodbc 的纯Python实现。

有没有办法在 setuptools.setup 中指定 install_requires=["pyobdc"],如果前面的包没有安装,就自动使用 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]
      )

不过我还是在寻找一个更通用的解决方案。

3 个回答

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

你的解决方案在这种情况下是正确的。现在这是完成这个任务最好的、最灵活的方法。

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,可能会遇到一些相当严重的兼容性问题。

撰写回答