質問

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

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

役に立ちましたか?

解決

Pyインストーラー 依存関係のない単一の .exe ファイルを作成します。使用 --onefile オプション。これは、必要なすべての共有ライブラリを実行可能ファイルにパックし、説明したように、実行前にそれらを解凍することによって行われます(編集:py2exe にもこの機能があります。参照してください。 ミンティの答え)

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

他のヒント

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

ここでは、bundle_file オプションのより完全な説明を直接引用します。 py2exeサイト*

「bundle_files」と「zipfile」の使用

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

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

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

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

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

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

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

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

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

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

1週間グーグルで検索した結果、ニーズに合わせてpy2exeスクリプトを変更する方法を見つけました。

私が提出したSourceForgeのパッチリンクは次のとおりです。コメントを投稿して、次の配布に含めることができます。

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

これは行われたすべての変更を説明しています。私はセットアップ行に新しいオプションを追加しただけです。これが私の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 = 実行ファイルのアイコン

file_resources = exe に埋め込みたいファイル

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

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

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"

わかりました、それはセットアップのためです。このアプリは 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!")

質問は何でも自由に尋ねることができました。

言われます BBフリーズ 単一のファイル .EXE が作成され、py2exe よりも新しいです。

試すc_x フリーズ優れたスタンドアロンを作成できます

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

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

from distutils.core import setup
import py2exe

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

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top