web-dev-qa-db-ja.com

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

py2exe がこれを行うことができると聞いたと思ったが、私はそれを理解できなかった。誰もこれを成功させましたか? setup.pyファイルと、使用したコマンドラインオプションを確認できますか?

基本的には、それ自身を/ tempに解凍して実行するような何かを実行する単一の実行可能ファイルを提供することを考えています。

136
Greg

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

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

99
dF.

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,
)
168
minty

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

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

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

13
Philippe F

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

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

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

4
Sebastian Noack

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

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

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

こちらがsourceforge iのパッチリンクです。コメントを投稿してください。次のディストリビューションに含めることができます。

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

これは、行われたすべての変更を説明します。セットアップラインに新しいオプションを追加しただけです。こちらが私の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])

壊す

script = py script私はexeにしたい

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リソースから画像をプルしようとします。コードで説明します。これは私のSpriteクラスの一部であり、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!")

どんな質問でも自由に尋ねることができました。

4
Nor

bbfreeze は単一の.EXEファイルを作成し、py2exeよりも新しいと言われています。

1
ℳ  .