说我要安装pyodbc
。它不能在某些Windows机器上构建,但有另一种选择 - pypyodbc
,它是pyobdc
的纯python实现。
有没有办法为install_requires=["pyobdc"]
指定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]
)
但我仍然在寻找更通用的解决方案。
答案 0 :(得分:1)
做你正在做的事情似乎是一个常见的建议,但由于这个问题是针对此类问题的热门搜索,我会指出$(document).ready(function() { }
支持相当错综复杂的迷你语言在PEP 508中指定:
install_requires
In a comment to a related question,用户Marius Gedminas注意到在代码中计算install_requires = [
'pypyodbc>=1.2.0;platform_system=="Windows"',
'pyodbc>=3.0.7;platform_system!="Windows"'
]
可能会产生一些不利影响,因此应首选上述内容以避免此问题。
(另一方面,如果您必须支持install_requires
的旧版本,https://hynek.me/articles/conditional-python-dependencies/会感到非常严重的可移植性问题。)
答案 1 :(得分:0)
对于这种情况,您的解决方案是正确的。这是实现这一任务的最佳和更灵活的方式。
答案 2 :(得分:0)
在设置中没有尝试 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'])