py2exe - erzeugen einzelne ausführbare Datei
Frage
Ich dachte, ich hörte, dass py2exe der Lage war, dies zu tun, aber ich dachte, es nie aus. Hat jemand erfolgreich getan? Kann ich Ihre setup.py-Datei zu sehen, und was Sie Befehlszeilenoptionen verwendet?
Im Grunde denke ich an es mir eine einzige ausführbare Datei geben, die etwas tut, wie sich unzips zu vielleicht / temp und läuft.
Lösung
PyInstaller wird eine einzelne EXE-Datei ohne Abhängigkeiten schaffen; Verwenden Sie die Option --onefile
. Es tut dies, indem alle benötigten gemeinsamen Bibliotheken in die ausführbare Packen und Auspacken, bevor es läuft, wie Sie es beschreiben (EDIT: py2exe auch über diese Funktion verfügt, finden Sie unter minty Antwort )
Ich verwende die Version von PyInstaller aus dem SVN, da die neueste Version (1.3) etwas veraltet ist. Es arbeitet sehr gut für eine Anwendung, die auf PyQt abhängt, PyQwt, numpy, scipy und ein paar mehr.
Andere Tipps
Die Art und Weise, dies mit py2exe zu tun ist, um die bundle_files Option in Ihrer setup.py-Datei zu verwenden. Für eine einzelne Datei möchten Sie bundle_files
bis 1, compressed
auf True, und stellen Sie die Zip-Datei Option auf Keine eingestellt. Auf diese Weise schafft eine komprimierte Datei für die einfache Verteilung.
Hier ist eine vollständigere Beschreibung der bundle_file Option direkt von der py2exe Website *
Mit "bundle_files" und "Zip-Datei"
Eine einfache (und besser) Art und Weise zu erstellen Single-File-Executables ist gesetzt bundle_files bis 1 oder 2 und einzustellen ZipFile auf Keine. Dieser Ansatz funktioniert erfordert keine Dateien ein Extrahieren temporären Speicherort, der vorsieht, viel schneller Programmstart.
Gültige Werte für bundle_files sind:
- 3 (default) nicht bündeln
- 2 Bündel alles, aber das Python-Interpreter
- 1 Bündel alles, einschließlich der Python-Interpreter
Wenn zipfile auf None gesetzt ist, werden die Dateien sein Bündel innerhalb der ausführbaren Datei statt library.zip.
Hier ist ein Beispiel 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,
)
Als das andere Plakat erwähnt, py2exe, wird eine ausführbare + einige Bibliotheken laden erzeugen. Sie können auch einige Daten zu Ihrem Programm hinzufügen müssen.
Der nächste Schritt ist ein Installationsprogramm zu verwenden, das alles in einer einzigen, einfach zu bedienende installierbar / unistallable Programm zu verpacken.
Ich habe verwendet InnoSetup ( http://www.jrsoftware.org/isinfo.php mit Freude) mehrere Jahre und für kommerzielle Programme, so dass ich es von ganzem Herzen empfehlen.
Sie sollten ein Installationsprogramm erstellen, wie zuvor erwähnt. Obwohl es auch möglich ist, py2exe zu lassen, alles in einer einzigen ausführbaren zu bündeln, von bundle_files Option auf 1 und das zipfile Schlüsselwort Argument Keine Einstellung, ich habe nicht diese empfehlen für PyGTK Anwendungen.
Das ist, weil von GTK + versucht, seine Datendateien (Einheimischer, Themen, etc.) aus dem Verzeichnis aus geladen wurde zu laden. Sie müssen also sicherstellen, dass das Verzeichnis der ausführbaren Datei enthält auch die von GTK + verwendeten Bibliotheken und Verzeichnisse lib, teilen und usw. von Ihrer Installation von GTK +. Andernfalls erhalten Sie Probleme an einer Maschine Ihrer Anwendung läuft, auf dem GTK + nicht systemweit installiert ist.
Für weitere Details lesen Sie meine Leitfaden für PyGTK Anwendungen py2exe. Es erklärt auch, wie alles zu bündeln, aber GTK +.
Ich habe in der Lage gewesen, eine einzelne EXE-Datei mit allen Ressourcen in die exe embeded zu erstellen. Ich baue auf Fenster. so wird, dass einige der os.system Anrufe erklären ich verwende.
Zuerst versuchte Umwandlung ich alle meine Bilder in bitmats und dann alle meine Daten-Dateien in Text-Strings. aber dies verursachte die endgültige exe sehr, sehr groß sein.
Nach googleing für eine Woche habe ich herausgefunden, wie py2exe Skript zu ändern, meine Bedürfnisse zu erfüllen.
Hier ist der Patch Link auf Source i eingereicht, bitte Kommentare schreiben, damit wir sie bekommen, die in die nächste Verteilung.
Dieses explanes all Änderungen vorgenommen hat, hinzugefügt habe ich einfach eine neue Option, um die Setup-Linie. hier ist mein setup.py.
Ich werde versuchen, es zu kommentieren, so gut ich kann. Bitte beachten Sie, dass mein setup.py der Tatsache, komplex, ist, dass ich bin die Bilder nach Dateinamen zugreifen. so muß ich eine Liste speichert den Überblick zu behalten.
Das ist von einem Mangel-to-b-Bildschirmschonern I zu machen versuchen.
I exec verwenden, um mein Setup zur Laufzeit zu generieren, seine easyer zu schneiden und so einzufügen.
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])
Aufschlüsselung
script = py Skript Ich möchte eine exe-Datei drehen
icon_resources = das Symbol für die exe
file_resources = Dateien möchte ich in die exe einbetten
other_resources = eine Zeichenkette in die exe einzubetten, in diesem Fall eine Dateiliste.
Optionen = py2exe Optionen für alles in eine exe-Datei erstellen
bitmap_strings = eine Liste von Dateien schließen
Bitte beachten Sie, dass file_resources ist keine gültige Option, bis Sie Ihre py2exe.py Datei bearbeiten, wie in dem Link oben beschrieben.
erste Mal, dass ich versucht habe, auf dieser Seite Code zu schreiben, wenn ich es falsch tun Flamme mich nicht.
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"
ok, das ist es für die setup.py jetzt die Magie benötigt Zugriff die Bilder. Ich entwickeln diese App ohne py2exe im Sinne es dann später hinzugefügt. so haben Sie Zugang zu den beiden Situationen sehen. wenn der Bildordner kann nicht gefunden werden es versucht, die Bilder von den exe Ressourcen zu ziehen. der Code wird es erklären. dies ist ein Teil meiner Sprite-Klasse und verwendet es eine directx. Sie können aber jede api verwenden Sie wollen oder einfach nur die Rohdaten zugreifen. spielt keine Rolle.
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!")
Haben Sie Fragen fragen fiel.
Ich habe gehört, dass bbfreeze wird eine einzelne Datei .EXE erstellen, und ist neuer als py2exe.
try C_X freeze es kann eine gute Standalone erstellen
Ich habe vor kurzem verwendet py2exe eine ausführbare Datei für die post-Bewertung erstellen für Bewertungen zu Reviewboard zu senden.
Dies war das setup.py I verwendet
from distutils.core import setup
import py2exe
setup(console=['post-review'])
Es erstellt ein Verzeichnis der EXE-Datei und die benötigten Bibliotheken enthält. Ich glaube nicht, es möglich ist, py2exe zu verwenden, nur eine einzelne EXE-Datei zu erhalten. Wenn Sie, dass Sie benötigen, um ersten py2exe zu verwenden und dann irgendeine Form von Installationsprogramm verwenden, um die endgültigen ausführbar zu machen.
Eine Sache zu kümmern ist, dass alle Ei Dateien, die Sie in Ihrer Anwendung verwenden müssen dekomprimiert werden, sonst kann py2exe sie nicht enthalten. Dies ist in dem py2exe docs abgedeckt.
Nein, es ist nicht, dass Sie im Sinne einer einzigen ausführbaren Datei ist, die Sie erst danach eine Datei haben -. Aber Sie haben ein Verzeichnis, das für die Ausführung Ihres Programms alles, was Sie enthält benötigen, einschließlich einer exe-Datei
Ich schrieb dieses setup.py heute. Sie müssen nur python setup.py py2exe
aufzurufen.