2010-01-07 3 views
2

Dans certains cas, différents modules implémentent chacun une API commune (dans mon cas, les anciens elementtree de pure-python, cElementTree, lxml.etree et xml.etree intégré). Je peux écrire le module en utilisant ElementTree pour essayer chacune de ces options, et prendre la première qui existe selon mon ordre de préférence - mais je ne trouve aucune information sur la spécification selon laquelle une seule d'entre elles doit être installée dans setup.py. Je veux écrire quelque chose qui ressemble à ceci:setuptools "au moins un de ces" spécifications de dépendance

setup(
    ..., 
    install_requires=""" 
     elementtree | cElementTree | lxml 
    """, 
    ... 
) 

Est-ce, ou quelque chose comme ça, possible?

Répondre

0

Je ne pense pas, mais, si vous utilisez un Python relativement récent, elementtree faisant partie des bibliothèques Python standard, pourquoi vous inquiétez-vous qu'il pourrait être absent? (Je comprends que ce serait un problème pour d'autres cas de plusieurs implémentations possibles d'une API, je me demande simplement si vous en avez vraiment besoin pour votre cas d'utilisation spécifique).

+0

Ce problème se produit réellement dans un module tiers open-source que nous utilisons, donc je cherchais une solution pour contribuer en tant que patch, et je voulais éviter l'apparence de honte publique des développeurs du module. Notre autre code dépend de lxml, et s'exécute dans Py26, donc nous avons au moins deux autres implémentations disponibles - mais pas celle appelée 'elementtree'. – dcrosta

0

Vous voudrez peut-être essayer de faire quelque chose comme ça dans setup.py:

install_requires = ["elementree"] 

try: 
    import cElementTree 
    install_requires = [] 
except ImportError: 
    try: 
     import lxml 
     install_requires = [] 
    except ImportError: 
     # etc for remaining equivalent modules 

setup(
    install_requires = install_requires, 
    # rest of setup parameters 
) 

Ce sera essentiellement package d'installation elementree comme si aucune dépendance de l'équivalent sont installés.

+0

Malheureusement, cela ne fonctionnera pas - le code est déployé via RPM, avec chaque module tiers (voir mon commentaire à la publication d'Alex Martelli) construit et installé dans un RPM séparé. Au moment où 'pkg_resources' vérifie les dépendances au démarrage, il est bien passé quand' setup.py' est exécuté (et en fait il n'est même pas présent sur le système où l'erreur se produit). – dcrosta

+0

Cela n'a aucun sens pour moi. Si vous déployez des paquets en tant que RPM, pourquoi exécuteriez-vous setup.py? –

+0

'setup.py' est exécuté pendant la construction RPM, et, entre autres choses, crée le' .egg-info/requires.txt' qui nomme "elementtree". Je trouve le bon endroit pour changer ceci dans 'setup.py' pour le composant avec la dépendance, ainsi que dans les modules qui essayent d'importer' elementtree'. – dcrosta

Questions connexes