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

问题描述 投票:0回答:3

说我要安装

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

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

python installation setuptools
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-dependency/ 如果您必须支持旧版本的setuptools

,则会感叹一些相当严重的可移植性问题。)


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'])
    
© www.soinside.com 2019 - 2024. All rights reserved.