回答:
PyInstallerは依存関係のない単一の.exeファイルを作成します。--onefile
オプションを使用します。これは、必要に応じてすべての共有ライブラリを実行可能ファイルにパックし、実行する前に解凍することで行います(編集:py2exeにもこの機能があります。mintyの回答を参照してください)。
最新リリース(1.3)は多少古いため、svnのPyInstallerのバージョンを使用しています。PyQt、PyQwt、numpy、scipyなどに依存するアプリでは、これは非常にうまく機能しています。
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,
)
windows = [{'script': "single.py"}]
とconsole = ['single.py']
ので、WindowsのCMDウィンドウで開きますファイルをダブルクリックします。
他のポスターで言及されているように、py2exeは、実行可能ファイルとロードするいくつかのライブラリを生成します。プログラムに追加するデータをいくつか持つこともできます。
次のステップは、インストーラーを使用して、これらすべてを1つの使いやすいインストール可能/アンインストール可能なプログラムにパッケージ化することです。
私はInnoSetup(http://www.jrsoftware.org/isinfo.php)を何年もの間、そして商用プログラムに喜んで使用してきたので、心からお勧めします。
すべてのリソースが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_resources': [('txt2.txt')]
それを書くとき私にエラーを与えます(私の.exeに組み込みたいファイルはtxt2という名前で、それは.txtファイルです) )
前述のように、インストーラーを作成する必要があります。bundle_filesオプションを1に設定し、zipfileキーワード引数をNoneに設定することで、py2exeですべてを単一の実行可能ファイルにバンドルすることもできますが、PyGTKアプリケーションにはお勧めしません。
これは、GTK +がデータファイル(ローカル、テーマなど)をロード元のディレクトリからロードしようとするためです。したがって、実行可能ファイルのディレクトリには、GTK +によって使用されるライブラリと、GTK +のインストールからのlib、shareなどのディレクトリも含まれていることを確認する必要があります。そうしないと、GTK +がシステム全体にインストールされていないマシンでアプリケーションを実行すると問題が発生します。
詳細については、PyGTKアプリケーション用のpy2exeのガイドを参照してください。また、GTK +以外のすべてをバンドルする方法についても説明します。
それは良いスタンドアロンを作成できるc_xフリーズを試してください
私は最近py2exeを使用して、レビューをReviewBoardに送信するためのレビュー後の実行可能ファイルを作成しました。
これは私が使用したsetup.pyでした
from distutils.core import setup
import py2exe
setup(console=['post-review'])
exeファイルと必要なライブラリを含むディレクトリを作成しました。py2exeを使用して単一の.exeファイルを取得することはできないと思います。それが必要な場合は、最初にpy2exeを使用してから、何らかの形式のインストーラーを使用して最終的な実行可能ファイルを作成する必要があります。
注意すべきことの1つは、アプリケーションで使用するすべてのeggファイルを解凍する必要があることです。それ以外の場合、py2exeはそれらを含めることができません。これはpy2exeのドキュメントで説明されています。
いいえ、後でファイルが1つしかないという意味で単一の実行可能ファイルが提供されるわけではありませんが、exeファイルを含め、プログラムを実行するために必要なすべてを含むディレクトリがあります。
今日、このsetup.pyを書きました。呼び出すだけですpython setup.py py2exe
。