41

アプリケーションを配布するときに、すべての卵を 1 つの zip ファイルに結合して、配布する必要があるのが 1 つの zip ファイルと実行可能ファイル (単純に起動し、zip ファイルのメイン関数をロードして python を開始するカスタム バイナリ) だけになるようにすると便利です。オフまたは類似)。

これをオンラインで行うという話を見たことがありますが、実際にそれを行う方法の例はありません。

(zipセーフの場合)卵をzipファイルに変換できることは承知しています。

よくわからないのは次のとおりです。

どうにかしてすべての卵を 1 つの zip ファイルにまとめることができますか? もしそうなら、どのように?

特定の卵からどのようにコードを読み込んで実行しますか?

その卵のコードがすべての依存関係 (つまり、zip ファイル内の他の卵) にアクセスできることをどのように保証しますか?

人々はこの種のことをよく尋ね、次のような答えを得ます。py2exe を使用します。はい、わかりました。それが 1 つの解決策です。ここで質問しているわけではないのですが…

4

7 に答える 7

11

zip ファイルの最上位に __main__.py[c] ファイルが含まれている場合、Python は単一のスクリプトであるかのように zip ファイルを実行します。パッケージのインポートは、__main__ が内部から実行されている zip 内もチェックします。

したがって、setup.py を作成します (py_modules = ['__main__']ここでは、すべてのパッケージと他のモジュールを指定するとともに重要です)。

次に、実行python setup.py bdist --format zipしてzipファイルを作成します。実行可能にしたい場合は、次のようにします。この時点で、他の Python スクリプトと同様に、結果の zip ファイルを実行できます。

これを読んで利便性を向上させるための Linux/Mac ユーザー向けのもう 1 つのステップ (ただし、py2exe について言及しているようなシナリオではない可能性があります)。

echo '#!/usr/bin/env python' > my_executable_zip
cat output_of_setup_py_bdist.zip >> my_executable_zip
chmod +x my_executable_zip

これは #! を先頭に追加するだけです。行を zip ファイルに追加して、シェルから実行するときにインタープリターを指定する必要がないようにします。この時点で、システム上の他のバイナリと同じように実行できますが、密かに python でいっぱいの zip ファイルです。私は通常、setup.py を実行するための makefile を作成してから、この変換を行います。

于 2013-10-23T14:05:21.577 に答える
1

はい、1 つの zip ファイル/egg で複数のモジュールを提供できるため、それらを 1 つのファイルに結合できます。しかし、私はそれが良い考えであることに非常に懐疑的です. そのzipファイルをインストールする必要があり、すでにインストールされている他のバージョンと競合する可能性があります。

したがって、最初に尋ねる質問は、目的は何かということです。なぜ、1 つのファイルだけが必要なのですか? インストールを簡単にするためですか、配布を簡単にするためですか、それとも何ですか?

ファイルが 1 つしかないからといって、インストールが簡単になるわけではありません。他にもっと良い方法があります。インストールに依存関係を自動的にダウンロードしてインストールさせることができます。これは簡単です。

また、それらを 1 つの zip ファイルにまとめるということは、その zip ファイルを展開して setup.py を実行する必要があることを意味しますが、これはあまりユーザーフレンドリーではありません。

したがって、1 つのファイルだけでは実際には多くの問題が解決されないため、問題はどの問題を解決しようとしているのかということです。

于 2013-07-05T10:33:03.123 に答える
0

どうにかしてすべての卵を 1 つの zip ファイルにまとめることができますか? もしそうなら、どのように?

はい、できます。Python は、sys.path に追加された zip アーカイブからロードされます ( PEP 273を参照)。すべての python ライブラリをアーカイブ内に配置すると、アーカイブはディレクトリとして扱われます。これは、py2exe、bbfreeze などの一部のツールがライブラリを分離するために実行できることです。

方法に関しては、egg のインストール方法 (pip、easy_install など) によって異なります。ロジックは、依存するすべての Egg を検査し、それらのインストール パスを収集してから、卵をアーカイブ内に圧縮することです。

特定の卵からどのようにコードを読み込んで実行しますか?

load と run を定義する必要があります。モジュールとパッケージのインポートについて話している場合、特別なことをする必要はありません。Python プログラムを実行可能な ZIP ファイルとしてパッケージ化するという警告を含む、このテーマに関する興味深いブログ投稿を次に示します。

その卵のコードがすべての依存関係 (つまり、zip ファイル内の他の卵) にアクセスできることをどのように保証しますか?

これは、卵が拡張機能でない限り (つまり、zip セーフ) 組み込まれています。こちらもご覧ください

于 2013-07-05T15:27:36.367 に答える
0

{app-home-dir/packages} に独自の「packages/eggs」を作成し (たとえば、そこで卵をコピーすることにより)、setup.py (setuptools) で追加のファイルを構成して、すべてを単一のディストリビューションとしてパックすることができます。 ( setup.py とは? )。アプリのメイン関数を起動する前に、{app-home-dir/packages} を sys.path に追加して、外部の「パッケージ/卵」が正確にどこにあるかを Python に通知する必要があることに注意してください。これはスタンドアロン パッケージを作成する簡単な方法ですが、依存関係とそのバージョン、Python モジュールと Ansi C コードの混合などに関して危険が伴います。

于 2013-07-05T11:07:08.720 に答える
0

卵を含むまったく同じ .exe ファイル内から卵を解凍した後、Python インタープリターを起動するように設定された自己解凍型の zip ファイルを使用できます。

于 2013-07-05T10:30:23.090 に答える