Egg としてパッケージ化された Python 拡張モジュールを、インストールせずにロード可能にするにはどうすればよいですか?
-
09-09-2019 - |
質問
ベースとなるビルド スクリプトを作り直しているところです 素晴らしい Waf ツール (私は何年もの間SConsを使用していましたが、それは単なる 方法 遅すぎる)。
とにかく、次の状況に遭遇しましたが、解決策が見つかりません。
- 以前にビルドされた多数のeggファイルに依存する製品があります。
- を使用して製品をパッケージ化しようとしています Pyインストーラー 構築プロセスの一部として。
- 最初に依存関係を構築します。
- 次に、PyInstaller を実行して、作成した卵に依存する製品をパッケージ化したいと思います。PyInstaller がパッケージ化プロセスの一部としてこれらの Egg ファイルをロードできるようにする必要があります。
これは簡単そうに思えます:あなたは何を解決しますか PYTHONPATH
のコピーを作成する必要があります sys.environ
変数を正しく設定し、次を使用して PyInstaller スクリプトを呼び出します。 subprocess.Popen
以前に構成した環境を env 引数として渡します。
問題はその設定です PYTHONPATH
追加する卵が zipsafe としてパッケージ化された拡張モジュールである場合、それだけでは十分ではないようです。この場合、組み込みライブラリをインポートできないことがわかります。
Egg を解凍すると (ディレクトリの名前を .egg に変更すると)、それ以上の設定を行わずにインポートできますが、これは今回の場合は希望したものではありません。
次の手順を実行して、サブシェルからインポートする卵を取得することもできます。
- 設定
PYTHONPATH
インポートしたいエッグを含むディレクトリ (エッグ自体のパスではありません) - Pythonシェルをロードして使用する
pkg_resources.require
卵を見つけるために。
これが完了すると、卵は通常どおりロードされます。繰り返しますが、これは現実的ではありません。なぜなら、これらの卵を最初からインポートできるように Python シェルを実行できる必要があるからです。
ダーティなオプションは、実際のターゲット スクリプトを呼び出す前に、上記のアクションを実行するラッパー スクリプトを出力することですが、これは間違ったことのように思えます。もっと良い方法があるはずです。
解決
ふむ、私はこれが私の悪いだったと思います。問題は、拡張パッケージのsetup.pyでzipsafe
フラグは、このような全くとしてそれを治療するためにあなたの能力に影響を与えると思われる、Falseに設定されたことがあったように見える。
今、私はTrueに、私は単にPYTHONPATH
にそれぞれ1を加えることで、卵のファイルをインポートできるように設定したこと。
私は他の誰かが1日、この答えは重宝しますね!
他のヒント
、あなたは常にあなたがコアシステムのpythonいじりなしでPythonのパッケージをインストールしてテストすることができますのpythonの仮想環境を作成し、「virtualenvのを」試みることができます