64

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

Web アプリケーション フレームワークである 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 が zip ファイルからモジュールをインポートできること、pipがすばらしい REQUIREMENTS ファイルを処理できること、そしてpipzipに GAE で使用するコマンドがあることを知っています。

(注: 同様の質問がいくつかあります — 12345 — しかし、それらはケース固有のものであり、実際には私の質問には答えません。)

4

7 に答える 7

70

これが私がそれを行う方法です:

  • 事業
    • .Python
    • 置き場
    • ライブラリ
      • python2.5
        • サイトパッケージ
          • < pip インストールパッケージはこちら >
    • 含む
    • ソース
      • 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 にデプロイするときは、* src ディレクトリに*あるものだけをデプロイし、それ以外は何もデプロイしません。appcfg.pyシンボリック リンクを解決し、ライブラリ ファイルを GAE にコピーします。

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

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

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

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

于 2011-02-01T14:48:29.080 に答える
46

簡単にどうですか:

$ 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

于 2014-08-29T08:06:44.167 に答える
6

私はビルドアウトの方が好きです。

プロジェクトまたは 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 のどのコピーが現在ソース ツリーに含まれていて、おそらくバージョン管理にコピーされているか (または、新しい開発者が手動で展開してアップグレードする必要があるか) を気にする代わりに、buildout.cfg でバージョンを確認するだけです。新しいバージョンが必要な場合は、buildout.cfg を変更して buildout を再実行します。

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

于 2013-04-03T06:07:18.093 に答える
2

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

Flask拡張機能をAppEngineで動作させる方法の例については、flask-appengine-templateプロジェクトをご覧ください。 https://github.com/kamalgill/flask-appengine-template

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

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

于 2011-03-18T17:30:09.090 に答える
2

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

これまでのところは問題ありませんが、ディレクトリがパスに追加されるため、含まれているライブラリ (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/

于 2014-09-14T12:39:24.717 に答える