3

開発環境を管理するために pip と virtualenv を使用している Django アプリケーションを作成しています。

依存関係の 1 つであるpkgme​​ には、その「バックエンド」である多くのデータ ファイルが付属しており、setup.py でdata_files=$FOO(ではなくpackage_data) で構成されています。

pkgme​​ がそのバックエンドを探すとき、os.path.join(sys.prefix, "share", "pkgme", "backends"). これは、pkgme​​ が正常にインストールされている場合はうまく機能し、ドキュメントと一致しているように見えますが、pkgme​​ が Egg としてインストールされている場合は機能しません。

そこでは、データ ファイルは、予期されていたので$VIRTUAL_ENV/lib/python2.7/site-packages/pkgme-0.1-py2.7.egg/shareはなく、下にインストールされ$VIRTUAL_ENV/shareます。

これにより、2 つの質問が残ります。

  1. os.path.joinEggインストールを使用しているか、従来のシステム インストールを使用しているかに関係なく、上記以外のものを使用してデータ ファイルを検索する必要がありますか? もしそうなら、何?
  2. Egg でデータ ファイルをより簡単に利用できるようにするには、データ ファイルを別の方法で配布する必要がありますか?

については知ってpkgutil.get_dataいますが、使用したくないことに注意してください。私はこれらのデータ ファイルの内容には興味がありません。その場所を知りたいので、それらを実行できます。

私の現在の計画はこれを行うことです:

  • package_dataの代わりに使用data_files
  • pkgme.__file__ではなく、相対的なバックエンドを探すように pkgme​​ を変更します。sys.prefix
4

2 に答える 2

2

現在の計画は本質的に正しいか、少なくとも実行可能なオプションです。

setuptools は、egg を作成するときに、egg 内のコードが を使用しているかどうかをチェックし、使用している__file__場合は、egg を圧縮形式でインストールできないものとしてマークします。このようにして、卵が easy_install によってインストールされると、ファイル.egg/に残される代わりにディレクトリに抽出され.eggます。

圧縮/ドロップイン インストール (つまり、卵を「インストール」せずにディレクトリにダンプするだけ) をサポートする場合は、代わりにpkg_resources.resource_filename() (docs here) APIを使用する必要__file__がありますが、パッケージは setuptools に依存します。または、その API を利用できるようにするために配布します。

于 2011-11-16T15:21:49.107 に答える
1

私は最終的に次のことをしました:

  • pkg_resources.resource_filename()含まれている独自のバックエンドを見つけるために使用する pkgme​​ を変更する
  • Python で記述されたバックエンドが独自のバックエンド スクリプトの場所を公開するために使用できるエントリ ポイントを追加しました
  • sys.prefixPython を使用したくないバックエンドの に基づくチェックを保持

差分はここにあります: http://bazaar.launchpad.net/~pkgme​​-committers /pkgme​​/trunk/revision/86

于 2011-11-18T17:02:17.343 に答える