61 votes

Comment gérer des bibliothèques Python tierces avec Google App Engine? (virtualenv? pip?)

Quelle est la meilleure stratégie pour la gestion des tiers les bibliothèques Python avec Google App Engine?

Dire que je veux utiliser Flacon, une webapp cadre. Une entrée de blog dit de faire ce qui ne semble pas droit:

$ cd /tmp/
$ wget http://pypi.python.org/packages/source/F/Flask/Flask-0.6.1.tar.gz
$ tar zxf Flask-0.6.1.tar.gz
$ cp -r Flask-0.6.1/flask ~/path/to/project/
(... repeat for other packages ...)

Il doit y avoir une meilleure façon de gérer le code tiers, surtout si je veux suivre les versions, les tests de mise à jour ou si les deux bibliothèques de partager un sous-répertoire. Je sais que Python peut importer des modules de zipfiles et que pip peut travailler avec une merveilleuse EXIGENCES de fichier, et j'ai vu que pip a un zip de commande pour une utilisation avec GAE.

(Note: Il ya une poignée de questions similaires - 1, 2, 3, 4, 5 - mais ils sont particulières à chaque cas et ne pas vraiment répondre à ma question.)

70voto

Y.H Wong Points 3810

Voici comment je le fais:

  • projet
    • .Python
    • bin
    • lib
      • python2.5
        • site-packages
          • < pip installer des paquets ici >
    • inclure
    • src
      • app.yaml
      • index.yaml
      • principal.yaml
      • < lien symbolique, le pip paquets installés dans ../lib/python2.5/site-packages

L' project répertoire est le répertoire de niveau supérieur où le virtualenv est assis. Je reçois le virtualenv en utilisant les commandes suivantes:

cd project
virtualenv -p /usr/bin/python2.5 --no-site-packages --distribute .

L' src annuaire est là tout votre code va. Lorsque vous déployez votre code de GAE, *seulement* déployer ces dans le répertoire src et rien d'autre. L' appcfg.py permettra de résoudre les liens symboliques et copie les fichiers de la bibliothèque de GAE pour vous.

Je n'ai pas installer mes bibliothèques sous forme de fichiers zip, principalement pour des raisons de commodité dans le cas où j'ai besoin de lire le code source, ce que j'ai à faire beaucoup, juste par curiosité. Toutefois, si vous voulez vraiment zip les bibliothèques, mettre l'extrait de code suivant dans votre main.py

import sys
for p in ['librarie.zip', 'package.egg'...]:
    sys.path.insert(0, p)

Après cela, vous pouvez importer vos zippé paquets comme d'habitude.

Une chose à regarder dehors pour est setuptools' pkg_resources.py. J'ai copié directement dans ma src annuaire donc mon liés à d'autres paquets peuvent l'utiliser. Attention pour tout ce qui utilise entry_points. Dans mon cas, je suis en utilisant Toscawidgets2 et j'ai dû creuser dans le code source manuellement fil des morceaux. Il peut devenir ennuyeux si vous avez eu beaucoup de bibliothèques qui dépendent entry_point.

45voto

Wernight Points 6086

Qu'en est-il simplement:

 $ pip install -r requirements.txt -t <your_app_directory/lib>
 

Créer / modifier <your_app_directory>/appengine_config.py :

 """This file is loaded when starting a new application instance."""
import sys
import os.path

# add `lib` subdirectory to `sys.path`, so our `main` module can load
# third-party libraries.
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'lib'))
 

6voto

tesdal Points 1781

Je préfère buildout.

Vous configurer les dépendances dans les setup.py dans votre projet ou votre buildout.cfg, pin les versions dans le buildout.cfg, et de préciser les paquets ne sont pas disponibles sur GAE et devraient être inclus dans packages.zip. de la tige.recette.appengine va copier les paquets requis dans packages.zip et tant que vous insérez packages.zip dans le sys.chemin d'accès, ils peuvent être importés de n'importe où.

Vous pouvez également utiliser les fourches de github si le paquet dont vous avez besoin n'est pas sur pypi

find-links =
    https://github.com/tesdal/pusher_client_python/tarball/rewrite#egg=pusher-2.0dev2

[versions]
pusher = 2.0dev2

et tous ces paramètres et les dépendances sont versionnées dans git.

Au lieu de vous demander une copie de la Fiole est actuellement inclus dans votre arborescence des sources et peut-être copié dans votre contrôle de version (ou d'établir de nouveaux développeurs manuellement déballage et mise à niveau), il vous suffit de cocher la version dans le buildout.cfg. Si vous voulez une nouvelle version, changement de buildout.cfg et exécutez à nouveau le buildout.

Vous pouvez également l'utiliser pour insérer des variables dans le fichier de configuration des modèles, comme le réglage de la appspot id et la version de l'app.yaml si vous avez de la mise en scène du serveur avec la mise en scène.cfg et ainsi de suite.

4voto

Faisal Points 1656

J'ai récemment créé un outil appelé gaenv. Il en résulte un requirements.txt format, mais n'est pas installé, vous pouvez l'installer avec le pip install-r requirements.txt ensuite, exécutez l'outil de ligne de commande gaenv.

$ pip install -r requirements.txt
$ gaenv

Cela crée des liens symboliques automatiquement, vous pouvez installer gaenv dans votre virtualenv trop et exécuter le binaire à partir de là. Voici un article de blog à ce sujet:

http://blog.altlimit.com/2013/06/google-app-engine-virtualenv-tool-that.html

également sur github

https://github.com/faisalraja/gaenv

2voto

kamalgill Points 41

Note: cette réponse est spécifique pour le ballon sur Google App Engine.

Voir le flacon appengine-projet de modèle pour un exemple de la façon d'obtenir Flacon extensions de travailler sur App Engine. https://github.com/kamalgill/flask-appengine-template

Baisse de l'extension dans l'espace de noms de dossier de package dans le dossier src/packages/flaskext et vous êtes tous ensemble. https://github.com/kamalgill/flask-appengine-template/tree/master/src/packages/flaskext

Non-Flacon paquets peuvent être déposés dans le répertoire src/packages dossier que les fichiers zip, les œufs, ou de décompresser des paquets, comme le modèle de projet comprend le sys.chemin d'accès.insert() extrait de code affiché ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: