setup.py中的替代依赖(回退)
假设我想安装 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
,可能会遇到一些相当严重的兼容性问题。