py2exeがこれを行うことができると聞いたと思いましたが、それを理解することはできませんでした。誰もこれを成功させましたか?setup.py ファイルと、使用したコマンド ライン オプションを確認できますか?
基本的に、/temp に解凍して実行するような単一の実行可能ファイルを提供することを考えています。
py2exeを使用してこれを行う方法は、setup.pyファイルでbundle_filesオプションを使用することです。単一のファイルの場合、bundle_files
1compressed
をTrueに設定し、zipfileオプションをNoneに設定します。このようにして、簡単に配布できるように1つの圧縮ファイルを作成します。
py2exeサイトから直接引用されたbundle_fileオプションのより完全な説明は次のとおりです*
「bundle_files」と「zipfile」を使用する
単一ファイルの実行可能ファイルを作成するためのより簡単な(そしてより良い)方法は、bundle_filesを1または2に設定し、zipfileをNoneに設定することです。このアプローチでは、一時的な場所にファイルを抽出する必要がないため、プログラムの起動がはるかに高速になります。
bundle_filesの有効な値は次のとおりです。
- 3(デフォルト)バンドルしない
- 2Pythonインタープリター以外のすべてをバンドルする
- Pythonインタープリターを含むすべてを1バンドル
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,
)
PyInstallerは、依存関係のない単一の.exeファイルを作成します。オプションを使用し--onefile
ます。これは、必要なすべての共有ライブラリを実行可能ファイルにパックし、実行前にアンパックすることで実行されます(編集:py2exeにもこの機能があります。ミンティの回答を参照してください) 。
最新リリース(1.3)はやや古くなっているため、svnのバージョンのPyInstallerを使用しています。これは、PyQt、PyQwt、numpy、scipyなどに依存するアプリで非常にうまく機能しています。
他のポスターが言及しているようにpy2exe
、 は実行可能ファイル + ロードするいくつかのライブラリを生成します。プログラムにデータを追加することもできます。
次のステップは、インストーラーを使用して、これらすべてを 1 つの使いやすいインストール可能/アンインストール可能なプログラムにパッケージ化することです。
私はInnoSetupを数年間商用プログラムで喜んで使用してきたので、心からお勧めします。
すべてのリソースが exe に埋め込まれた単一の exe ファイルを作成できました。私は窓の上に建てています。そのため、私が使用している 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 = exe のアイコン
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"
わかりました、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!")
どんな質問でも自由に聞いてください。
前述のように、インストーラーを作成する必要があります。bundle_files オプションを 1 に設定し、zipfile キーワード引数を None に設定することで、py2exe にすべてを単一の実行可能ファイルにバンドルさせることも可能ですが、PyGTK アプリケーションにはこれをお勧めしません。
これは、GTK+ がロード元のディレクトリからデータ ファイル (ローカル、テーマなど) をロードしようとするためです。そのため、実行可能ファイルのディレクトリに、GTK+ で使用されるライブラリと、GTK+ のインストールの lib、share などのディレクトリも含まれていることを確認する必要があります。そうしないと、GTK+ がシステム全体にインストールされていないマシンでアプリケーションを実行する際に問題が発生します。
詳細については、PyGTK アプリケーション用の py2exe のガイドを参照してください。また、GTK+ 以外のすべてをバンドルする方法についても説明します。
bbfreezeは単一のファイル.EXEを作成し、py2exeよりも新しいと言われています。
最近、py2exeを使用して、レビューをReviewBoardに送信するためのポストレビュー用の実行可能ファイルを作成しました。
これは私が使用したsetup.pyでした
from distutils.core import setup
import py2exe
setup(console=['post-review'])
exeファイルと必要なライブラリを含むディレクトリを作成しました。py2exeを使用して単一の.exeファイルを取得することは不可能だと思います。必要な場合は、最初にpy2exeを使用してから、何らかの形式のインストーラーを使用して最終的な実行可能ファイルを作成する必要があります。
注意すべきことの1つは、アプリケーションで使用するすべてのeggファイルを解凍する必要があることです。そうしないと、py2exeにそれらを含めることができません。これについては、py2exeのドキュメントで説明されています。
c_x freezeを試すと 、適切なスタンドアロンを作成できます
いいえ、後でファイルが 1 つしかないという意味で、実行可能ファイルは 1 つではありませんが、プログラムを実行するために必要なすべてのファイル (exe ファイルを含む) を含むディレクトリがあります。
今日、このsetup.pyを書きました。を呼び出すだけですpython setup.py py2exe
。