说我要安装
pyodbc
。它无法在某些 Windows 机器上构建,但有一个替代方案 - pypyodbc
,它是 pyodbc
的纯 Python 实现。
有没有办法为
install_requires=["pyodbc"]
指定 setuptools.setup
,如果未安装前一个软件包,则回退到 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]
)
但我仍在寻找更通用的解决方案。
做你已经在做的事情似乎是一个常见的建议,但由于这个问题是此类问题的热门谷歌点击,我会指出
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-dependency/ 如果您必须支持旧版本的setuptools
,则会感叹一些相当严重的可移植性问题。)
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'])