2012-06-28 8 views
5

Actualmente, uno de mis paquetes requiere un analizador/codificador JSON y está diseñado para usar simplejson si está disponible, volviendo al módulo json (en la biblioteca estándar) si es necesario (como los puntos de referencia muestran simplejson es más rápido).¿Puedo definir paquetes opcionales en setuptools?

Sin embargo, recientemente se ha sido golpeado & se pierda en cuanto a si simplejson se instalará cuando se utiliza zc.buildout - algo con el paso a github, creo. Lo que me hizo preguntarme; ¿Es posible definir paquetes opcionales en mi archivo setup.py que, si no está disponible, no detendrá la instalación de mi paquete?

Respuesta

0

AFAIK no hay forma de definir un paquete opcional y no sería útil hacerlo. ¿Qué esperas cuando defines un paquete opcional? ¿Que está instalado cuando aún no está disponible? (Eso de alguna manera lo haría obligatorio)

No, en mi humilde opinión la forma correcta de abordar esto es en sus importaciones donde desea utilizar el paquete. Por ejemplo:

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

Por supuesto, esto requiere que los dos APIs son compatibles, pero este es el caso de simplejson y el paquete estándar de la biblioteca json.

+2

opcional que significaría que si el paquete no logra instalar, la instalación puede completarse sin obstáculos. –

+0

De acuerdo, pero si no * confía vitalmente * en un paquete, ¿por qué ponerlo en los * paquetes obligatorios * de todos modos? Simplemente no entiendo el punto. – Constantinius

+0

No quiero ponerlo en la lista 'required'; eso es lo que estoy preguntando: ¿hay alguna otra opción para que pueda incluirse si está disponible, pero se ignora si no? –

6

paquetes opcionales en el momento de la instalación.

Supongo que está hablando de su secuencia de comandos setup.py. Se podría cambiarlo a tener:

# mypackage/setup.py 

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

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

entonces usted puede hacer cualquiera de:

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

con esta última instalación simplejson>=3.5.3.

En lugar de intentar instalar todo y recurrir a una buena versión conocida, , le conviene instalar el subconjunto de paquetes que sabe que funcionan.

paquetes opcionales en tiempo de ejecución.

Una vez que tiene dos conjuntos diferentes de paquetes que se pueden instalar, necesita para asegurarse de que pueda usarlos si están disponibles. P.ej. para su json importación:

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

Otro ejemplo más complejo:

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 

Pero también se puede encontrar este patrón en algunos paquetes:

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

... 

if optional_package: 
    # do addtional behavior 
Cuestiones relacionadas