2012-06-28 1 views
5

Attualmente uno dei miei pacchetti richiede un parser/codificatore JSON ed è progettato per utilizzare simplejson se disponibile ricollegandosi al modulo json (nella libreria standard) se necessario (poiché i benchmark mostrano che simplejson è più veloce).Posso definire i pacchetti opzionali in setuptools?

Tuttavia, recentemente è stato colpito & mancato se simplejson verrà installato quando si utilizza zc.buildout - qualcosa con il passaggio a GitHub, credo. Il che mi ha fatto domandare; è possibile definire pacchetti opzionali nel mio file setup.py che, se non disponibile, non fermerà l'installazione del mio pacchetto?

risposta

0

AFAIK non esiste un modo per definire un pacchetto opzionale e non ci sarebbe alcun modo di farlo. Cosa ti aspetti quando definisci un pacchetto opzionale? Che è installato quando non è ancora disponibile? (che in qualche modo lo renderebbe obbligatorio)

No, IMHO il modo corretto di indirizzarlo è nelle importazioni in cui si desidera utilizzare il pacchetto. Per esempio:

try: 
    from somespecialpackage import someapi as myapi 
except ImportError: 
    from basepackage import theapi as myapi 

Questo naturalmente richiede che i due API sono compatibili, ma questo è il caso con simplejson e il pacchetto di libreria standard json.

+2

opzionale vorrebbe dire che se il pacchetto non riesce a installare, l'installazione può completare senza impedimenti. –

+0

Ok, ma se non * vitaly si basa * su un pacchetto, perché inserirlo nei * pacchetti richiesti * comunque? Semplicemente non capisco il punto. – Constantinius

+0

Non voglio metterlo nella lista 'required'; questo è quello che sto chiedendo - c'è un'altra opzione in modo che io possa averlo incluso se disponibile, ma ignorato se no? –

6

pacchetti opzionali al momento dell'installazione.

Suppongo che tu stia parlando dello script setup.py. Si potrebbe cambiare per avere:

# mypackage/setup.py 

extras = { 
    'with_simplejson': ['simplejson>=3.5.3'] 
} 

setup(
    ... 
    extras_require=extras, 
    ...) 

allora si può fare uno di:

  • pip install mypackage,
  • pip install mypackage[with_simplejson]

con quest'ultimo installazione simplejson>=3.5.3.

Invece di provare a installare tutto e fallback su una versione nota, si consiglia di installare il sottoinsieme di pacchetti che si conosce.

pacchetti opzionali al momento dell'esecuzione.

Dopo aver installato due diversi set di pacchetti, è necessario il per assicurarsi di poterli utilizzare se disponibili. Per esempio. per la vostra json importazione:

try: 
    # helpful comment saying this should be faster. 
    import simplejson as json 
except ImportError: 
    import json 

Un altro esempio più complesso:

try: 
    # xml is dangerous 
    from defusedxml.cElementTree import parse 
except ImportError: 
    try: 
     # cElementTree is not available in older python 
     from xml.cElementTree import parse 
    except ImportError: 
     from xml.ElementTree import parse 

Ma si può anche trovare questo modello in alcuni pacchetti:

try: 
    optional_package = None 
    import optional.package as optional_package 
except ImportError: 
    pass 

... 

if optional_package: 
    # do addtional behavior