どうすればPythonプログラムを配布できますか?


102

私のアプリケーションは次のようになります:

main.py
ウィンドウズ/
    __init__.py
    mainwindow.py
    ...
モデル/
    __init__.py
    orders.py
    ...
リソース/
    image1.png
    logo.jpg
    ...

プログラムはmain.pyで開始されます。それから「最終」アプリケーションを作成する良い方法はありますか?私はpy2exe / py2appのようなものを考えていますが、Pythonインタープリター/モジュールを実行可能ファイルが1つしかないアプリケーションにコピーしていません。

私はdistutilsを調べましたが、これはプログラムをPythonディレクトリにインストールするように見えますが、これはLinux以外のプラットフォームでは一般的ではありません。

現時点では、ソースフォルダー全体をターゲットマシンにコピーし、main.pywWindowsのエイリアスを作成します。いくつかの不便:

  • アイコンは、デフォルトのpythonアイコンです。
  • エイリアスを手動で作成する必要があります。
  • 私のソースディレクトリには、ソース管理フォルダーのような追加のファイルがたくさんあります。
  • 名前main.pymain.pyw手動で変更する必要があります。
  • `.pyo *ファイルのみがターゲットマシンにあると便利です。それには本当の理由はありません、私は不必要なファイルを持っているのが好きではありません。

どのようにすれば素晴らしい自動配布を作成できますか?

  • Windows用?(現時点で私がサポートしなければならない唯一のプラットフォームです。)
  • Mac用?
  • Linux用?

2
「distutilsを確認しましたが、これはプログラムをPythonディレクトリにインストールするように見えますが、これはLinux以外のプラットフォームでは一般的ではありません。」なぜそれを言っているのですか?それを読んだどのテキストを読みましたか?それは確かに真実ではありませんが、どこでその印象を得ましたか?
S.Lott、2009年


回答:


37

Pythonアプリケーションを配布する通常の方法は、distutilsを使用することです。ライブラリタイプのPythonモジュールとPythonアプリケーションの両方を配布するために作成されていますが、Windowsでどのように機能するかはわかりません。いずれの場合でも、distutilsを使用する場合、WindowsではPythonを個別にインストールする必要があります。

Linuxの場合はdisutils、Windowsの場合はPy2exeなどで配布することをお勧めします。OS XIについてはわかりません。エンドユーザーアプリケーションの場合は、おそらくディスクイメージタイプのものが必要ですが、その方法はわかりません。ただし、ユーザーエクスペリエンスの詳細については、この投稿を参照してください。プログラマー向けに作成されたアプリケーションの場合、おそらくOS Xでのdistutilsタイプのインストールでも問題ありません。


1
MacとLinuxは現時点ではそれほど重要ではありません。Py2appは.appバンドルを作成します。.dmgでのMacアプリの出荷は古くなっていると思います。.zipを使用する必要があります。distutilsを使用してディレクトリdistを作成し、すべての関連ファイルをその中にコピーすることは可能ですか?
GeorgSchölly、2009年

1
@gs:sdistコマンドは、すべてのソースファイルのtarファイルを作成します。
Martin v。Löwis09年

5
@gs:.dmgでMacアプリを配布することは、実際には非常に一般的です。.dmgはディスクイメージであり、アプリケーション(.app)の形式ではありません。したがって、いくつかのREADMEファイルと共に、.dmg内に単一の.appを見つけることがよくあります。
Eric O Lebigot、2009年

2
@gs distutilsにディレクトリdistを作成させ、そこにファイルをコピーさせたい理由がわかりません。自分で行うことができます。DistutilsはWindowsインストーラーの作成を含む多くのことを行い、Python 2.6からはスタートメニューにリンクを作成します。ただし、Pythonを個別にインストールする必要があるため、エンドユーザーアプリの場合、py2exeには独自のPythonが含まれているため、py2exeの方がより良いソリューションだと思います。OS Xの配送/インストーラーについては、Alexander Limiのブログ記事で詳細に説明されているため、私は彼に委ねます。
Lennart Regebro、2009年


61

すべての主要なプラットフォームをかなりシームレスにサポートするPyinstallerを強くお勧めします。py2exeとpy2appのように、Windowsでは標準の実行可能ファイルを、OS Xではアプリバンドルを生成しますが、共通の依存関係を自動解決し、追加の構成調整を行わずにそれらを含めるという素晴らしい仕事をするという利点もあります。

また、Python 2.6をWindowsにデプロイする場合は、このパッチをPyinstallerトランクに適用する必要があります。

インストーラーは不要だとおっしゃっていましたが、Windowsプラットフォームでは、Inno Setupは使いやすく、セットアップも簡単です。


3
やりすぎかどうかはわかりません。アプリをPyinstallerにバンドルすることは、実際には他の方法よりも簡単です。特に、C拡張機能に依存する方法は、ほとんどの場合、1行のコマンドライン呼び出しと同じくらい簡単です。特に開発者がターゲットマシンを手動で構成できず、クライアントに指示を提供する必要がある場合は、Python +依存関係+アプリ自体(distutilsなどを通じて、または単にzipファイルを通じて)のインストールがより複雑になります。少なくともWindowsでは、配布のスタイルは理にかなっていると思います。
Daniel Naab、2009年

1
pyinstallerで少し不便ですが、pyinstallerで作成した実行可能ファイルを使用すると、実行の開始に数秒かかります。
JuanPablo 2014年

1
まさに私が探していたもの。何もインストールできないコンピューターでスクリプトを実行させる必要がある場合があります。外部依存関係のない単一の実行可能ファイルが必要です。数秒で起動できます。ありがとうございました!
CodeMonkey

単純なHello worldプログラムでは500MBのスペースと3〜5秒の初期化時間がかかるため、小規模なアプリケーションにはお勧めしません。
Raf

別の環境を使用してアプリケーションを配布することで(たとえば、envvまたはpyenvを使用して)、このスペースの量を回避できます
Alexander Santos

4

Fredrik Lundh squeeze.pyは、Pythonインタープリターを含まず、代わりにバイトコードを含む単一のファイルを作成できます。正しい引数を使用すると、結果ファイルに他のファイル、モジュールなどを含めることができます。1つのプロジェクトでうまく使用しました。結果のプログラムは、OS X、Linux、Windowsで問題なく実行されました。

PS:各マシンには、squeeze.pyによって生成されたバイトコードと互換性のあるPythonインタープリターが必要です。必要に応じて、Pythonのバージョンごとに異なるバイトコードバージョンを生成できます(適切なバージョンのPythonでsqueeze.pyを実行するだけです)。


4

PEXについても言及する価値があると思います(この質問が受けた注意力を高め、質問自体を減らすことを考慮してください)。独自の説明によると:

PEXファイルは、自己完結型の実行可能なPython仮想環境です。より具体的には、PEXランタイムとの対話を可能にする#!/usr/bin/env python特別なと特別なzipファイルが慎重に作成されてい__main__.pyます。zipアプリケーションの詳細については、PEP 441を参照してください。

pythonのパッケージ化の概要を読んだとき、それを偶然見つけました。彼らはこの素敵な写真をそこに投稿しました: ここに画像の説明を入力してください

要約すると、ターゲットマシンにpythonがインストールされていることに依存する余裕がある場合は、PEXを使用して、たとえばPyInstallerによって生成される実行可能ファイルよりもファイルサイズがおそらく小さい自己完結型の»実行可能ファイルを生成します。



1

Windowsで配布している場合は、インストーラーを使用して、必要なすべての関連ファイル/インターペッターをインストールします。setup.exeを配布します。これがWindowsの最良の方法です。そうでなければ、ユーザーは不満を言うでしょう。


1
プログラムを使用するユーザーは1人だけなので、インストーラーは必要ありません。しかしもちろん、より多くのユーザーのためにWindowsでなくてはならないプログラムを書くときは。
GeorgSchölly、2009年

1
@gs:ああ、1人のユーザーのみ。結構です。それから、ソースディストリビューションまたはWindowsバイナリインストーラーのいずれかで、基本的なdistutilsパッケージを作成することをお勧めします。これは間違いなく、Pythonモジュールを配布する簡単で便利な方法です。
Lennart Regebro、2009年

0

Pythonデスクトップアプリケーションを配布するための最も便利な*クロスプラットフォームの方法は、クロスプラットフォームのcondaパッケージマネージャーに依存することです。それを使用するいくつかのツールがあります:

  • Miniconda-Install -Minicondaを自動ダウンロードし、アプリ用の分離されたconda環境を作成するpowershell / bashスクリプト。pipをサポートしていますが、メンテナンスされていないようで、httpsダウンロードの問題があります。
  • Anaconda ProjectおよびContinuumによる(conda)コンストラクター。どちらもcondaを使用します。(conda)コンストラクターは、Windows上で自己完結型インストーラーやNSISインストーラーを作成できるようですが、pipをサポートしていません。Anaconda / Minicondaインストーラーのように動作するようです。
  • PyAppShare-エンドユーザーが最初にMiniconda / Anacondaをインストールします(ランタイム環境のように)。次に、単一のインストールバッチ/ bashスクリプトがyaml仕様から分離されたconda環境を作成します。アプリケーションは、環境にインストールされるconda / pipパッケージ自体でもあり、実行可能なエントリポイントが作成されます。クロスプラットフォームのデスクトップとプログラムのショートカットが自動的に作成されます。それらは環境をアクティブにし、アプリケーションを起動します。ピップをサポートします。

*開発者にとって最も便利です。エンドユーザーにとっては十分便利です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.