web-dev-qa-db-ja.com

すべてのOSのpythonスクリプトをフリーズします

ここ数年、私はpythonで素敵な小さなプログラムを作成しましたが、今それを配布したいと思いますが、多くの潜在的なユーザーがそうしたので、私の最初の試みはあまり熱意に出くわしませんでした。 pythonおよびアプリケーションの実行に必要なすべての依存関係をダウンロードしてインストールするという考えは好きではありません。

私は何週間か私のコードをみんなのために実行しやすいものにコンパイルするための解決策を探して何週間も探しましたが、私が見つけたものに本当に満足していません。

実際にコンパイルするのではなく、アプリケーションをフリーズするという考えには何の問題もありません。それは、エンドユーザーがアプリケーションをダウンロードするためにさらに数秒待機し、自分のハードディスク上のより多くのスペースを占有することを意味します。

私の問題は、仮想マシンやワインなどをインストールする必要なしに、すべてのアプリケーションをすべてのOSの実行可能ファイル(大きなものとしましょう:Windows、Mac、Linux-明らかにすべてのOSに対して異なる実行可能ファイル)にパッケージ化する方法を見つけることですオプション。アプリケーションをパッケージ化する方法とまったく同じようにパッケージ化された一連のren'pyゲームを見たので、それが可能であると強く思いますが、プログラムで同じ結果を得る方法がわかりません。

概略的に、私のアプリケーションは実行するためにコンソールを必要とし、いくつかの自家製のパッケージ、numpyとmatplotlibを含みます。また、動的に言語ファイルを含む複数の言語をサポートするシステムがあり、以前の設定を上書きします。

exec('from lang.%s import lang' % language)

これはいくつかの問題を引き起こす可能性があると思います。最後に、プログラムは最初の実行で設定、ログなどを保存するためにいくつかのフォルダーを必要とするため、これらも含める必要があります。私のコンピューターはubuntu mate 16.10(x64)を実行しており、pythonバージョンは2.7ですが、将来的にはpythonに変換する予定です。3。作成された実行可能ファイル必要なほぼすべてを含む単一の重いファイル、または軽量のファイルであり、その他はすべてnearフォルダーにあります。私は実際にどちらか一方のソリューションを優先することはありません。

この質問は時々表示され、おそらくすでに回答されていることは承知していますが、この種の質問の最後の発生は2014年までさかのぼることができました。 。

編集:私が提案した条件では解決策がないように見えるので、いくつかのエミュレーター/ラッパー/互換性レイヤー/さまざまなOS用のフリーザーを実行するために何でもセットアップすることを考えることができますが、私はそうではありません何をすべきかを確認してください。私はあちこちを読んでいますが、ワインが常に適切に機能するとは限らず、LinuxでMac用にコンパイルするものを見つけることができません。私が理解している限り、プログラムは32/64ビットシステム用に別のコンパイルを必要とすべきではありませんが、あらゆる可能性のためにコンパイルする簡単な方法があればそれは素晴らしいでしょう。仮想マシンはまだ使えません。現在、ディスクに2つ以上の仮想マシンをセットアップするスペースがありません(これはssdディスクの大きな欠点です...)。年に数回使用して、フリーソフトウェアをコンパイルします。

23
GRB

ここではまだ見たことがないので、Dockerを起動すると思いました。配布可能なようですVMこれには、何らかのパッケージまたはアプリケーションが含まれています。無料のコミュニティエディションがgithubで利用可能です https://github.com/docker/docker 。私は自分で使用したことがありませんが、軽量、無料、プラットフォームに依存しないというすべての基準に適合しているようです。

7
Dan Temkin

最初に物事をカップルします。

  • Pythonはすでにクロスプラットフォームです
  • Pythonコードは解釈され、ネイティブにコンパイルされた言語ではなく、コンパイルする必要はありません
  • Python setuptoolsには、クロスプラットフォーム互換の実行可能スクリプトを配布するための標準メソッドが存在します
  • サードパーティpythonライブラリcanには、インストール時またはバイナリパッケージ用にコンパイルが必要なネイティブコード(C)を含めることができますNumPyとmatplotlibはこのカテゴリにあり、Windows AFAIKで使用できるバイナリパッケージを持っています。

次に、実行可能なスクリプトをインストールするsetup.pyコードの例を示します。

from setuptools import setup, find_packages
setup(<...>,
      entry_points={'console_scripts': [
          '<console cmd name here> = my_package.module:main'
]})

my_package.moduleは、たとえば

my_package/module.py

<..>
def main():
    <what to run when <console cmd name here> is executed>

次に、パッケージを標準として配布できますpythonモジュール、pipからインストール可能。コードがオープンソースの場合、PyPiでホストできます(PyPiサイトの手順を参照)セットアップ方法)。

それ以外の場合は、ソースまたはバイナリホイールパッケージ(それぞれpython setup.py sdistおよびpython setup.py bdist_wheel)をビルドしてユーザーに配布できます。

バイナリホイールは、インストール先のプラットフォームで構築する必要があります。ソースディストリビューションはどのプラットフォームでも機能しますが、純粋にソースコードが含まれているため、インストール時にコードを実行する必要があります。

バイナリホイールパッケージのビルド/インストールには、pip version> = 6.0およびsetuptools> = 26.0が必要です。

このパッケージをインストールすると、<console cmd name here>実行可能ファイルが、パッケージを正常にインストールできるすべてのプラットフォームで実行できるようになります。

これを行う簡単なサンプルパッケージについては、 hello-world-python-package 、特にその setup.py を参照してください。

バイナリホイールパッケージの詳細については、 pythonwheels site を参照してください。

8
danny

プログラムが自己完結型パッケージであるとが期待する唯一のプラットフォームは、ms-windowsです。これは主に、ネイティブツールチェーンに関する歴史的な理由によるものです。たとえば、ms-toolchain(IIRC)のバージョン2016までは、Python numpyのような拡張モジュールはexactlyPython自体と同じバージョンのms-toolchainです。これにより、ms-windowsの拡張モジュールの構築は非常に困難になります。

ほとんどのUNIXライクなオペレーティングシステムには、機能的なパッケージ管理があります(ただし、アップルのOS-Xでは、これはサードパーティによって提供されます)。これにより、Pythonのインストールが比較的簡単になります。

役立つ可能性があるのは、アプリケーションを youtube-dl のようにzipファイルにパックすることです。私は build.py と呼ばれるスクリプトを作成しましたが、これは私のプログラムのいくつかでこれを行います。

4
Roland Smith

仕事で、私はあなたが望むもののようなことをして、それをするために私は自分のコードを書いてしまいました。すべてがLinux上に構築されていますが、私はLinuxとWindowsの両方のパッケージを出荷しています。パッケージにはPythonインタープリターとライブラリーが含まれており、顧客がすでにPythonをインストールしているかどうかに関係なく、同じように機能します。

基本的に、Pythonインタープリターを組み込んで、システムにインストールされたPythonを無視して、出荷するPythonコードのみをロードするように設定する小さなプログラムが必要です。適切に記述されたこのプログラムは、サポートするアーキテクチャごとにクロスコンパイルできます。次に、アーキテクチャに必要なPython DLLを、使用するPythonコードを含むZipファイルとともに出荷します(.pycまたは.pyoファイルのみが必要です)。このZipファイルには、必要なだけの標準ライブラリも含める必要があります。

警告:

  • テスト用の仮想マシンも必要です。
  • アーキテクチャごとにCクロスコンパイラを正しく設定することは、困難な場合があります。
  • Pythonのsite.pyもvirtualenvが使用するものも、システムから完全に分離することはできませんPythonインストール。自分でsite.pyを作る必要がありました。
  • 誤ってシステムPythonにリンクするのは簡単です。ビルドスクリプトでpkg-configおよびコンパイラの引数を使用する方法については、十分に注意してください。
  • Pythonが誤ってシステムPythonライブラリをロードしようとするのは簡単です。 Pythonパス、およびおそらくPy_IgnoreEnvironmentFlagの設定には十分注意してください。
  • Windowsの場合、py2exeでかなり遠くまで行くことができ、私が提案しているものよりも簡単です。 Python以外のアプリケーションにPythonコードを埋め込んでいるので、主にpy2exeを使用していません。

私のアプリケーションは一部のPythonを使用したGoにあるため、ラッパーをcgo経由でPython WSGIコードを呼び出すGoパッケージとして作成しました。ほとんどのPython埋め込みコード here を確認できます。ただし、そのリポジトリはすべてではありません。カスタムPythonビルドのスクリプトと、アプリ自体のビルドスクリプトと初期化コードは、現在公開されていません。

3
MicahStetson

JAVAはどうですか? python code into Java jarまたは.exeとして配布しますか?

http://www.jython.org/jythonbook/en/1.0/JythonAndJavaIntegration.html

このQAはあなたの場合に役立つかもしれません。 my PythonスクリプトをJythonでJARファイルとして配布していますか?

3
oshaiken

初期反応

  • Windowsでは p2exe を使用します
  • Linuxの場合は python's freeze を使用します
  • Macosの場合は同じフリーズを使用します-機能するはずです(推測だけで、1つのGoogle検索によってのみ保持されます)

(プログラムの変更が必要になる場合があります。例:__file__は使用できません)


初期問題への可能な代替アプローチ

<...>多くの潜在的なユーザーがpythonをダウンロードしてインストールするという考えを好まなかったので、それほど熱心に遭遇しませんでした

プログラムの隣にpythonインストーラー自体を含めることで、ユーザーの反対意見を解決できるかもしれません。(実際のpythonインストーラーまたは http:// portablepython .com /
すなわちインストーラーへのリンクだけでなく、すべてのインストーラーと、場合によってはすべてをインストールするbat/shスクリプトを追加します。

Ren'Py

Ren'Py を数回言及します。その ドキュメント は、ゲームにPythonコードを追加する方法を説明しています。 Pythonステートメント セクションは サードパーティを追加する方法も説明していますパッケージ (例:numpyおよびmatplotlib) Windows、Mac、およびLinux用のファイルを生成 できます。アプリケーションを希望どおりに実行でき、すでに慣れている場合それなら、あなたはそれを使うべきです。

PyInstaller

別のオプションは PyInstaller です。 複数のオペレーティングシステムのサポート セクションで、次のように述べています。

WindowsとMac OS Xの両方など、複数のOSにアプリケーションを配布する必要がある場合は、各プラットフォームにPyInstallerをインストールし、それぞれに個別にアプリをバンドルする必要があります。

2番目の段落では、これを単一のマシンで行う方法について説明します。

これは、仮想化を使用して単一のマシンから実行できます。無料のvirtualBoxまたは有料のVMWareおよびParallelsを使用すると、別の完全なオペレーティングシステムを「ゲスト」として実行できます。 「ゲスト」OSごとに仮想マシンを設定します。その中に、Python、アプリケーションに必要なサポートパッケージ、PyInstallerをインストールします。

PyInstallerは numpyおよびmatplotlibのサポート をアドバタイズします。

仮想マシンとホストされたオペレーティングシステム

SSDに仮想マシン用のスペースがないとおっしゃっていました。外付けUSBハードドライブを購入して、そこに仮想マシンを保存できます。または、オペレーティングシステムホスティングプロバイダーを使用することもできます。 Googleを使用して、これらの詳細を調べることができます。特定のホスティングプロバイダーの使用方法について質問がある場合は、新しい質問を作成する必要があります。

クロスプラットフォームテスト

Ren'Pyを使用している場合でも、ほぼ確実に仮想マシンまたはホストされているオペレーティングシステムで結果をテストする必要があります。プログラムが他のプラットフォームで正しく動作することを確認する唯一の方法は、それらのプラットフォームでテストすることです。ホスティングソリューションを使用すると、「フリーソフトウェアのコンパイルに年に数回使用されるOSのライセンスに対する支払い」を回避できます。ただし、ホスティングにお金を費やすことになります。

無料の価格

お金をかけずにPython Windows、Mac、およびLinux用のアプリケーションを開発することが目標である場合は、Ren'Pyで立ち往生しており、アプリケーションのテストをユーザーに任せている可能性があります。オペレーティングシステム。

2
David Cullen

「フリーズ」アプリケーションを書いてあなたが本当に何をしているのかはわかりませんが、私がそれを理解している場合は、プログラムを実行するために必要なすべてのライブラリとファイルをインストールするインストーラにコードをコンパイルする必要があります。 noobコンピューターユーザーを処理します。

OK。今、あなたは2つの選択肢があります:

A)各システムのインストーラーを個別に作成します- Inno setup またはPackageBuilder(mac)などのツールを使用して作成できますpythonが既にインストールされている(インストールされていない場合)かどうかを確認し、ファイルをコピーします+デスクトップにショートカットを作成する(またはそのようなもの)+外部スクリプトを実行する(必要な場合)または Py2exe またはmac Py2app を使用できるWindowsのバイナリが必要です。Linuxにはそのようなものはありませんが、Linuxを使用しているユーザーが通常は上級ユーザーである場合。

pythonインストーラーをビルドするためのすべてのプラットフォームに自動ビルダーのようなものがないことを知っている場合は、お金がある場合は Bitrock Install Builder で作業を増やすことができます。

B)独自のスクリプトを作成します-ユーザーがすでにpythonを持っている場合は、ファイルを手動でダウンロードおよびインストールするためのスクリプトを作成できます(上級ユーザー向けの製品である場合、私にとって最良の解決策ですが、GUIを作成する場合、noobにとって問題にはなりません)

2
Samuel Tulach