web-dev-qa-db-ja.com

サードパーティのPython Google App Engineでライブラリを管理するにはどうすればよいですか?(virtualenv?pip?)

Google App EngineでサードパーティのPythonライブラリを管理するための最良の戦略は何ですか?

WebappフレームワークであるFlaskを使用したいとします。 ブログエントリ はこれを行うように指示しますが、正しくないようです:

$ 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 ...)

特にバージョンの追跡、アップグレードのテスト、または2つのライブラリがサブディレクトリを共有する場合は、サードパーティのコードを管理するためのより良い方法が必要です。 Python zipfilesからモジュールをインポートできること、およびpipが素晴らしいREQUIREMENTSファイルで機能することを知っています。 pipには、GAEで使用するZipコマンドがあることがわかりました。

(注:少数の類似した質問があります— 12 、、 45 —しかし、それらはケース固有であり、本当に私の質問に答えません。)

61
a paid nerd

単純にどうですか:

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

<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'))

更新:

Googleはサンプルを appengine_config.py に更新しました。

    from google.appengine.ext import vendor
    vendor.add('lib')

注:例に .gitignore がありますが、lib/ディレクトリーを無視しますが、git-Pushデプロイメント方式を使用する場合は、そのディレクトリーをソース管理下に置く必要があります。

45
Wernight

以下にその方法を示します。

  • 事業
    • .Python
    • 置き場
    • lib
      • python2.5
        • サイトパッケージ
          • <pip install packages here>
    • 含める
    • src
      • app.yaml
      • index.yaml
      • main.yaml
      • <../lib/python2.5/site-packagesのpipインストール済みパッケージをシンボリックリンクします

projectディレクトリは、virtualenvが存在する最上位ディレクトリです。次のコマンドを使用してvirtualenvを取得します。

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

srcディレクトリは、すべてのコードが置かれる場所です。コードをGAEにデプロイするとき、*only* srcディレクトリにコードをデプロイします。 appcfg.pyはシンボリックリンクを解決し、ライブラリファイルをGAEにコピーします。

ライブラリをZipファイルとしてインストールするのは、主にソースコードを読む必要がある場合に便利なためです。これは、たまたま好奇心からやっています。ただし、ライブラリを本当に圧縮したい場合は、次のコードスニペットをmain.pyに入れてください

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

この後、zipパッケージを通常どおりインポートできます。

注意すべきことの1つは、setuptoolsのpkg_resources.pyです。それをsrcディレクトリに直接コピーして、他のシンボリックリンクパッケージで使用できるようにしました。 entry_pointsを使用するものには注意してください。私の場合、Toscawidgets2を使用しているため、ソースコードを掘り下げて手動でピースを接続する必要がありました。 entry_pointに依存するライブラリがたくさんあると、面倒になります。

70
Y.H Wong

buildout を好みます。

プロジェクトまたはbuildout.cfgのsetup.pyで依存関係を設定し、buildout.cfgでバージョンを固定し、GAEで使用できないパッケージを指定し、packages.Zipに含める必要があります。 rod.recipe.appengineは必要なパッケージをpackages.Zipにコピーし、packages.Zipをsys.pathに挿入する限り、どこにでもインポートできます。

必要なパッケージがpypiにない場合は、githubからフォークを使用することもできます

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

[versions]
pusher = 2.0dev2

これらの設定と依存関係はすべてgitでバージョン管理されています。

Flask=のどのコピーが現在ソースツリーに含まれており、おそらくバージョン管理にコピーされているか(または新しい開発者が手動でアンパックしてアップグレードする必要がある)) cfg。新しいバージョンが必要な場合は、buildout.cfgを変更してbuildoutを再実行します。

また、staging.cfgなどを使用してステージングサーバーがある場合にapp.yamlでappspot idおよびversionを設定するなど、構成ファイルテンプレートに変数を挿入するために使用することもできます。

6
tesdal

最近、gaenvというツールを作成しました。 requirements.txt形式に従いますが、インストールはしません。pipinstall -r requirements.txtでインストールしてから、コマンドラインツールgaenvを実行できます。

$ pip install -r requirements.txt
$ gaenv

これにより、シンボリックリンクが自動的に作成されます。gaenvをvirtualenvにインストールし、そこからバイナリを実行できます。これについてのブログ記事は次のとおりです。

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

githubでも

https://github.com/faisalraja/gaenv

4
Faisal

Wernightのソリューションofficial Flask=アプリ例 の現在のプラクティスに最も近い。これは、sys.path.insert()名前空間パッケージ を許可するためにsite.addsitedir()を呼び出す)は、付随する.pthファイル(Pyramidのようなフレームワークにとって重要)を処理します。

これまでのところは良いですが、そのがディレクトリをパスに追加し、そのため、含まれるライブラリ(WebObやリクエストなど)を新しいものでオーバーライドする機会を失いますバージョン。

appengine_config.pyで必要なのは(そして、この変更を公式リポジトリにも受け入れようとしているのです)次のとおりです。

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

dirname = 'lib'
dirpath = os.path.join(os.path.dirname(__file__), dirname)

# split path after 1st element ('.') so local modules are always found first
sys.path, remainder = sys.path[:1], sys.path[1:]

# add `lib` subdirectory as a site directory, so our `main` module can load
# third-party libraries.
site.addsitedir(dirpath)

# append the rest of the path
sys.path.extend(remainder)

このコードの最終バージョンは、vendor.pyモジュールに隠され、insertsitedir(index, path)または他のバリエーションのように呼び出されることがあります。これは、 このプルリクエストに関するディスカッションで =、しかし、ロジックは多かれ少なかれどのように動作するか、名前空間のものを含むすべてのパッケージでシンプルなpip install -r requirements.txt -t lib/が動作できるようにし、含まれているライブラリを新しいバージョンで上書きできるようにしますbeen より簡単な代替を見つけることができません

2
webmaven

注:この回答は、Google App EngineのFlaskに固有のものです。

App Engineで動作するためのFlask拡張機能を取得する方法の例については、flask-appengine-templateプロジェクトを参照してください。 https://github.com/kamalgill/flask-appengine-テンプレート

Src/packages/flaskextの名前空間パッケージフォルダーに拡張機能をドロップすると、設定は完了です。 https://github.com/kamalgill/flask-appengine-template/tree/master/src/lib/flaskext

プロジェクトテンプレートには上記のsys.path.insert()スニペットが含まれているため、Flask以外のパッケージはZipファイル、eggs、または解凍されたパッケージとしてsrc/packagesフォルダーにドロップできます。

2
kamalgill