2014-04-14 12 views
6

Powiedz, że chcę zainstalować pyodbc. Nie można go zbudować na niektórych komputerach z systemem Windows, ale istnieje alternatywa - pypyodbc, która jest czystą implementacją Pythona pyobdc.Alternatywne zależności (fallback) w pliku setup.py

Czy istnieje sposób określenia install_requires=["pyobdc"] dla setuptools.setup z powrotem do pypyodbc, jeśli poprzedni pakiet nie został zainstalowany?

UPD: Moje rozwiązanie dla tej konkretnej sytuacji:

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

Ale nadal wyglądają na bardziej ogólne rozwiązanie.

+0

widzę nic złego w swoim podejściu. To wygląda prawidłowo zgodnie z dokumentami. https://pythonhosted.org/setuptools/setuptools.html#declaring-dependencies – rh0dium

Odpowiedz

1

Robienie tego, co już robisz, wydaje się być powszechną rekomendacją, ale ponieważ to pytanie jest najwyższym hiterem tego typu pytań, zwrócę uwagę, że install_requires obsługuje dość skomplikowany mini-język, który jest określony w PEP 508 :

install_requires = [ 
    'pypyodbc>=1.2.0;platform_system=="Windows"', 
    'pyodbc>=3.0.7;platform_system!="Windows"' 
] 

In a comment to a related question użytkownik Marius Gedminas zauważa, że ​​posiadanie install_requires obliczane w kodzie może mieć pewne negatywne skutki, więc powyższe powinny być preferowane, aby uniknąć tego problemu.

(Z drugiej strony, https://hynek.me/articles/conditional-python-dependencies/ lamentuje kilka bardzo poważnych problemów przenośności jeśli trzeba wspierać stare wersje setuptools.)

+0

Do tej pory nie byłem w stanie znaleźć żadnej specyfikacji ani praktycznego przykładu składni takiej jak 'foo || składnia paczek w pakietach Debiana, aby powiedzieć, że chcesz zainstalować 'foo' lub' bar'. – tripleee

0

Twoje rozwiązanie jest poprawne w tej sytuacji. Jest to najlepszy i bardziej elastyczny sposób na osiągnięcie tego zadania.

Powiązane problemy