py2exe-単一の実行可能ファイルを生成する


141

py2exeがこれを実行できると聞いたのですが、わかりませんでした。誰かがこれを成功させましたか?setup.pyファイルと、使用したコマンドラインオプションを確認できますか?

基本的に私はそれを私におそらく/ tempに解凍して実行するような何かをする単一の実行可能ファイルを与えることを考えています。


これはPython 3、またはPython 2以降のバージョンに適用されますか?
ヴィンセント

回答:


105

PyInstallerは依存関係のない単一の.exeファイルを作成します。--onefileオプションを使用します。これは、必要に応じてすべての共有ライブラリを実行可能ファイルにパックし、実行する前に解凍することで行います(編集:py2exeにもこの機能があります。mintyの回答を参照してください)。

最新リリース(1.3)は多少古いため、svnのPyInstallerのバージョンを使用しています。PyQt、PyQwt、numpy、scipyなどに依存するアプリでは、これは非常にうまく機能しています。


5
卵を使用している場合、py2exeはpyInstallerよりもはるかにうまく機能することがわかりました。mintyの答えはソリューションです。
gbjbaanb 2009

バージョン1.4以降、PyInstallerはWindows上のPython 2.6以降をサポートしないことに注意してください
Joril

2
現在バージョン1.5.1を使用していますが、Python 2.7.2でも動作します。
oob

1
py2exeは、コンパイラプログラムでいくつかの引数を指定すると、単一の実行可能ファイルを作成できます。py2exeには、単一ファイルの実行可能ファイルのオンラインチュートリアルがあります。
trevorKirkby 2013

2
客観的な視点:py2exeを使用して単一のexeファイルを作成するという質問には対応していないため、これがどのように受け入れられる答えかはわかりません。(それにもかかわらず、これはもちろん有用な答えです。)
Jonathan Komar

171

py2exeを使用してこれを行う方法は、setup.pyファイルでbundle_filesオプションを使用することです。単一のファイルの場合はbundle_files、1 compressedをTrueに設定し、zipfileオプションをNoneに設定します。このようにして、簡単に配布できるように1つの圧縮ファイルを作成します。

これは、py2exeサイトから直接引用されたbundle_fileオプションのより完全な説明です*

「bundle_files」と「zipfile」の使用

単一ファイルの実行可能ファイルを作成するより簡単な(そしてより良い)方法は、bundle_filesを1または2に設定し、zipfileをNoneに設定することです。このアプローチでは、一時的な場所にファイルを抽出する必要がないため、プログラムの起動がはるかに高速になります。

bundle_filesの有効な値は次のとおりです。

  • 3(デフォルト)バンドルしない
  • 2 Pythonインタープリター以外のすべてをバンドル
  • 1 Pythonインタープリターを含むすべてをバンドル

zipfileがNoneに設定されている場合、ファイルはlibrary.zipではなく実行可能ファイル内にバンドルされます。

サンプルのsetup.pyは次のとおりです。

from distutils.core import setup
import py2exe, sys, os

sys.argv.append('py2exe')

setup(
    options = {'py2exe': {'bundle_files': 1, 'compressed': True}},
    windows = [{'script': "single.py"}],
    zipfile = None,
)

5
インタプリタのみをバンドルしない場合は、bundle_filesオプションに2を選択してください。幸運を!
ミント

13
bundle_files 1はamd64ではサポートされていないことに注意してください(少なくともPython 2.6ではpy2exe 0.6.9)
Joril

2
@Pat:py2exeを実行するための呼び出しは「python setup.py py2exe」です。最後に「py2exe」を自動的に追加することで、コマンドラインで入力する必要がないことを意味します。
12

2
Microsoft Visual CランタイムDLLインストールする必要があるため、単一の実行可能ファイルではありません。
ケビンスミス2012

2
単一の実行可能ファイルとして使用したいコンソールアプリケーションがありました。私は交換していたwindows = [{'script': "single.py"}]console = ['single.py']ので、WindowsのCMDウィンドウで開きますファイルをダブルクリックします。
Jeff B 14

13

他のポスターで言及されているように、py2exeは、実行可能ファイルとロードするいくつかのライブラリを生成します。プログラムに追加するデータをいくつか持つこともできます。

次のステップは、インストーラーを使用して、これらすべてを1つの使いやすいインストール可能/アンインストール可能なプログラムにパッケージ化することです。

私はInnoSetup(http://www.jrsoftware.org/isinfo.php)を何年もの間、そして商用プログラムに喜んで使用してきたので、心からお勧めします。


+1は、py2exeを実行した後も、パッケージ化する必要があることを示します。
ホアキン

6

すべてのリソースがexeに埋め込まれた単一のexeファイルを作成することができました。私は窓の上に構築しています。これで、使用しているos.system呼び出しの一部が説明されます。

まず、すべての画像をビットマットに変換し、次にすべてのデータファイルをテキスト文字列に変換してみました。しかし、これにより最終的な実行ファイルが非常に大きくなりました。

1週間グーグルで検索した後、自分のニーズを満たすためにpy2exeスクリプトを変更する方法を見つけました。

ここに私が提出したsourceforgeのパッチリンクがあります。コメントを投稿して、次のディストリビューションに含めることができるようにしてください。

http://sourceforge.net/tracker/index.php?func=detail&aid=3334760&group_id=15583&atid=315583

これは、行われたすべての変更をexplanesします。セットアップ行に新しいオプションを追加しただけです。これが私のsetup.pyです。

私はできる限りコメントするようにします。私のsetup.pyはファイル名で画像にアクセスしているので複雑です。それらを追跡するためにリストを保存する必要があります。

これは、私が作ろうとしていたスクリーンセーバーからのものです。

私はexecを使用して実行時にセットアップを生成します。そのようにカットアンドペーストする方が簡単です。

exec "setup(console=[{'script': 'launcher.py', 'icon_resources': [(0, 'ICON.ico')],\
      'file_resources': [%s], 'other_resources': [(u'INDEX', 1, resource_string[:-1])]}],\
      options={'py2exe': py2exe_options},\
      zipfile = None )" % (bitmap_string[:-1])

壊す

スクリプト= exeスクリプトに切り替えたいpyスクリプト

icon_resources = exeのアイコン

file_resources = exeに埋め込むファイル

other_resources = exeに埋め込む文字列、この場合はファイルリスト。

options =すべてを1つのexeファイルに作成するためのpy2exeオプション

bitmap_strings =含めるファイルのリスト

上記のリンクで説明されているようにpy2exe.pyファイルを編集するまで、file_resourcesは有効なオプションではないことに注意してください。

私がこのサイトにコードを投稿しようとしたのは初めてですが、私が誤解した場合は、私を怒らせないでください。

from distutils.core import setup
import py2exe #@UnusedImport
import os

#delete the old build drive
os.system("rmdir /s /q dist")

#setup my option for single file output
py2exe_options = dict( ascii=True,  # Exclude encodings
                       excludes=['_ssl',  # Exclude _ssl
                                 'pyreadline', 'difflib', 'doctest', 'locale',
                                 'optparse', 'pickle', 'calendar', 'pbd', 'unittest', 'inspect'],  # Exclude standard library
                       dll_excludes=['msvcr71.dll', 'w9xpopen.exe',
                                     'API-MS-Win-Core-LocalRegistry-L1-1-0.dll',
                                     'API-MS-Win-Core-ProcessThreads-L1-1-0.dll',
                                     'API-MS-Win-Security-Base-L1-1-0.dll',
                                     'KERNELBASE.dll',
                                     'POWRPROF.dll',
                                     ],
                       #compressed=None,  # Compress library.zip
                       bundle_files = 1,
                       optimize = 2                        
                       )

#storage for the images
bitmap_string = '' 
resource_string = ''
index = 0

print "compile image list"                          

for image_name in os.listdir('images/'):
    if image_name.endswith('.jpg'):
        bitmap_string += "( " + str(index+1) + "," + "'" + 'images/' + image_name + "'),"
        resource_string += image_name + " "
        index += 1

print "Starting build\n"

exec "setup(console=[{'script': 'launcher.py', 'icon_resources': [(0, 'ICON.ico')],\
      'file_resources': [%s], 'other_resources': [(u'INDEX', 1, resource_string[:-1])]}],\
      options={'py2exe': py2exe_options},\
      zipfile = None )" % (bitmap_string[:-1])

print "Removing Trash"
os.system("rmdir /s /q build")
os.system("del /q *.pyc")
print "Build Complete"

さて、setup.pyはこれで終わりです。今度は魔法が画像にアクセスする必要がありました。私はこのアプリをpy2exeなしで開発し、後で追加しました。両方の状況でのアクセスが表示されます。画像フォルダが見つからない場合は、exeリソースから画像をプルしようとします。コードはそれを説明します。これは私のスプライトクラスの一部であり、directxを使用しています。ただし、任意のAPIを使用することも、生データにアクセスすることもできます。関係ありません。

def init(self):
    frame = self.env.frame
    use_resource_builtin = True
    if os.path.isdir(SPRITES_FOLDER):
        use_resource_builtin = False
    else:
        image_list = LoadResource(0, u'INDEX', 1).split(' ')

    for (model, file) in SPRITES.items():
        texture = POINTER(IDirect3DTexture9)()
        if use_resource_builtin: 
            data = LoadResource(0, win32con.RT_RCDATA, image_list.index(file)+1) #windll.kernel32.FindResourceW(hmod,typersc,idrsc)               
            d3dxdll.D3DXCreateTextureFromFileInMemory(frame.device,   #Pointer to an IDirect3DDevice9 interface
                                              data,                #Pointer to the file in memory
                                              len(data),           #Size of the file in memory
                                              byref(texture))      #ppTexture
        else:
            d3dxdll.D3DXCreateTextureFromFileA(frame.device, #@UndefinedVariable
                                               SPRITES_FOLDER + file,
                                               byref(texture))            
        self.model_sprites[model] = texture
    #else:
    #    raise Exception("'sprites' folder is not present!")

質問は自由に聞いてください。


私はあなたの方法を試しましたが、それはうまくいきますが、オプションfile_resurcesにファイルを追加して、いくつかのファイルを.exeに組み込む方法を理解していません。私はあなたが言ったようにbuild_exe.pyファイルを変更しました、しかし私がsetup.pyファイルに行って\'file_resources': [('txt2.txt')]それを書くとき私にエラーを与えます(私の.exeに組み込みたいファイルはtxt2という名前で、それは.txtファイルです) )
VinceLomba 2015

すべての画像をビットマットに変換し、すべてのデータファイルをテキスト文字列に変換する方法について説明しました。それはexeを大きくすると言っていましたが、これはうまくいきますか?私はこの答えがかなり古いことを知っていますが、あなたが答えることができればそれは感謝されます。
Peppa

4

前述のように、インストーラーを作成する必要があります。bundle_filesオプションを1に設定し、zipfileキーワード引数をNoneに設定することで、py2exeですべてを単一の実行可能ファイルにバンドルすることもできますが、PyGTKアプリケーションにはお勧めしません。

これは、GTK +がデータファイル(ローカル、テーマなど)をロード元のディレクトリからロードしようとするためです。したがって、実行可能ファイルのディレクトリには、GTK +によって使用されるライブラリと、GTK +のインストールからのlib、shareなどのディレクトリも含まれていることを確認する必要があります。そうしないと、GTK +がシステム全体にインストールされていないマシンでアプリケーションを実行すると問題が発生します。

詳細については、PyGTKアプリケーション用のpy2exeのガイドを参照してください。また、GTK +以外のすべてをバンドルする方法についても説明します。


1

私はbbfreezeが単一のファイル.EXEを作成し、py2exeより新しいと聞いています。


3
私が理解できる限り、bbfreezeは単一ファイルの実行可能ファイルを生成しません。あなたの答えを文書化できますか?
joaquin

-1

それは良いスタンドアロンを作成できるc_xフリーズを試してください


cx_Freezeはスタンドアロンの実行可能ファイルを作成できません。実際、buildmedia.readthedocs.org / media / pdf / cx-freeze / latest /…にあるcx_Freezeのドキュメントで は、「cx_Freezeは単一のファイルexeのビルドをサポートしていません。アプリケーションのライブラリは、1つの実行可能ファイルに埋め込まれています。」cx_Freezeのスタンドアロン実行可能ファイルの詳細については、ドキュメント(buildmedia.readthedocs.org/media/pdf/cx-freeze/latest/…)に移動し、セクション4.5に移動してください。
Peppa

-2

私は最近py2exeを使用して、レビューをReviewBoardに送信するためのレビュー後の実行可能ファイルを作成しました。

これは私が使用したsetup.pyでした

from distutils.core import setup
import py2exe

setup(console=['post-review'])

exeファイルと必要なライブラリを含むディレクトリを作成しました。py2exeを使用して単一の.exeファイルを取得することはできないと思います。それが必要な場合は、最初にpy2exeを使用してから、何らかの形式のインストーラーを使用して最終的な実行可能ファイルを作成する必要があります。

注意すべきことの1つは、アプリケーションで使用するすべてのeggファイルを解凍する必要があることです。それ以外の場合、py2exeはそれらを含めることができません。これはpy2exeのドキュメントで説明されています。


-6

いいえ、後でファイルが1つしかないという意味で単一の実行可能ファイルが提供されるわけではありませんが、exeファイルを含め、プログラムを実行するために必要なすべてを含むディレクトリがあります。

今日、このsetup.pyを書きました。呼び出すだけですpython setup.py py2exe


1
これは正確ではありません。正しいオプションを使用すると、1つのスタンドアロンファイルを取得できます。
trevorKirkby 2013

@Torsten Marek ...あなたのsetup.pyへのリンクは死んでいます。特に、最初の2つの再説は最終的には商業的なものを宣伝します。三回目は、それが終了し、ここで、インターネットのデッドエンドで。
ZF007
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.