2011-11-15 6 views
3

J'écris une application Django qui utilise pip & virtualenv pour gérer son environnement de développement. L'une des dépendances, pkgme, contient de nombreux fichiers de données qui constituent ses «backends» et sont configurés dans son fichier setup.py avec data_files=$FOO (plutôt que package_data).Comment distribuer/accéder aux fichiers de données dans Oeuf Python?

Lorsque pkgme ​​cherche ses backends, il regarde os.path.join(sys.prefix, "share", "pkgme", "backends"). Cela fonctionne très bien quand pkgme ​​a été installé normalement, et semble correspondre à documentation mais fonctionne pas lorsque pkgme ​​est installé comme un oeuf.

Là, les fichiers de données sont installés sous $VIRTUAL_ENV/lib/python2.7/site-packages/pkgme-0.1-py2.7.egg/share plutôt que le $VIRTUAL_ENV/share attendu.

Ce qui me laisse avec deux questions:

  1. devrais-je utiliser autre chose que ci-dessus os.path.join pour trouver les fichiers de données indépendamment du fait que nous utilisons une installation d'oeuf ou une installation de système traditionnel? Si oui, quoi?
  2. Dois-je distribuer différemment mes fichiers de données afin de les rendre plus facilement disponibles dans un œuf?

Notez que je connais environ pkgutil.get_data, mais je préfère ne pas l'utiliser. Je ne suis pas intéressé par le contenu de ces fichiers de données, je veux connaître leur emplacement à la place, afin que je puisse les exécuter.

Mon plan actuel est de le faire:

  • Utilisation package_data au lieu de data_files
  • changement pkgme ​​à rechercher backends par rapport à pkgme.__file__ plutôt que sys.prefix

Répondre

1

je fini par faire ce qui suit:

  • Changer pkgme ​​utiliser pkg_resources.resource_filename() pour trouver ses propres backends inclus
  • Ajout d'un point d'entrée que tout backend écrit en Python peut utiliser pour publier l'emplacement de son propre scripts back-end
  • a gardé le contrôle sys.prefix basé pour tout backend qui ne veulent pas utiliser Python

la diff peut être fo und ici: http://bazaar.launchpad.net/~pkgme-committers/pkgme/trunk/revision/86

1

Votre plan actuel est essentiellement correct , ou est en tout cas une option réalisable. Lorsque setuptools crée un œuf, il vérifie si le code dans l'œuf utilise __file__ et, dans ce cas, il marque l'œuf comme n'étant pas installable sous forme comprimée. De cette façon, lorsque l'oeuf est installé par easy_install, il sera extrait dans un répertoire .egg/ au lieu d'être laissé dans un fichier .egg.

Si vous voulez soutenir compressé/l'installation sans rendez-vous (c.-à-le dumping que l'œuf dans un répertoire sans « installation » il), alors vous devez utiliser la pkg_resources.resource_filename()(docs here) API au lieu de __file__, mais votre colis sera Dépend de setuptools ou distribue afin que cette API soit disponible.

+0

Merci PJE. Bon à savoir à propos du contrôle "__file__". Je suis allé avec une approche similaire à celle que j'ai suggéré dans la question, mais avec l'utilisation supplémentaire de points d'entrée pour gérer certains backends. – jml

Questions connexes