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

时间:2014-04-14 12:44:02

标签: python installation setuptools

说我要安装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]
      )

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

3 个答案:

答案 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'])