py2exe - Generiert eine einzelne ausführbare Datei

142

Ich dachte, ich hätte gehört, dass py2exe dies kann, aber ich habe es nie herausgefunden. Hat jemand dies erfolgreich gemacht? Kann ich Ihre setup.py-Datei sehen und welche Befehlszeilenoptionen haben Sie verwendet?

Grundsätzlich denke ich daran, dass ich eine einzige ausführbare Datei bekomme, die sich sozusagen in / temp entpackt und ausgeführt wird.

Greg
quelle
Gilt dies für Python 3 oder Versionen nach Python 2?
Vincent

Antworten:

105

PyInstaller erstellt eine einzelne EXE-Datei ohne Abhängigkeiten. Verwenden Sie die --onefileOption. Dazu werden alle erforderlichen gemeinsam genutzten Bibliotheken in die ausführbare Datei gepackt und vor der Ausführung entpackt, wie Sie es beschrieben haben (BEARBEITEN: py2exe verfügt auch über diese Funktion, siehe Mintys Antwort ).

Ich benutze die Version von PyInstaller von svn, da die neueste Version (1.3) etwas veraltet ist. Es hat sehr gut für eine App funktioniert, die von PyQt, PyQwt, Numpy, Scipy und ein paar mehr abhängt.

dF.
quelle
5
Ich fand, dass py2exe viel besser funktioniert als pyInstaller, wenn Sie Eier verwenden. Mintys Antwort ist die Lösung.
Gbjbaanb
Bitte beachten Sie, dass PyInstaller ab Version 1.4 Python 2.6+ unter Windows nicht unterstützt
Joril
2
Ich verwende jetzt Version 1.5.1 und es funktioniert mit Python 2.7.2.
oob
1
py2exe kann eine einzelne ausführbare Datei erstellen, wenn Sie im Compilerprogramm einige Argumente angeben. py2exe bietet ein Online-Tutorial für ausführbare Dateien für einzelne Dateien.
TrevorKirkby
2
Objektiver Standpunkt: Ich sehe keine akzeptable Antwort, da hier nicht die Frage der Erstellung einer einzelnen exe-Datei mit py2exe behandelt wird. (Trotzdem ist dies natürlich eine nützliche Antwort.)
Jonathan Komar
171

Die Möglichkeit, dies mit py2exe zu tun, besteht darin, die Option bundle_files in Ihrer Datei setup.py zu verwenden. Für eine einzelne Datei möchten Sie bundle_filesauf 1 setzen,compressed auf True und die Option zipfile auf None setzen. Auf diese Weise wird eine komprimierte Datei für die einfache Verteilung erstellt.

Hier finden Sie eine ausführlichere Beschreibung der Option bundle_file, die direkt von der py2exe-Site * zitiert wird.

Verwenden von "bundle_files" und "zipfile"

Eine einfachere (und bessere) Möglichkeit, ausführbare Dateien für einzelne Dateien zu erstellen, besteht darin, bundle_files auf 1 oder 2 und zipfile auf None zu setzen. Bei diesem Ansatz müssen keine Dateien an einen temporären Speicherort extrahiert werden, wodurch der Programmstart erheblich beschleunigt wird.

Gültige Werte für bundle_files sind:

  • 3 (Standard) nicht bündeln
  • 2 Bündeln Sie alles außer dem Python-Interpreter
  • 1 Bündel alles, einschließlich des Python-Interpreters

Wenn zipfile auf None festgelegt ist, werden die Dateien in der ausführbaren Datei anstelle von library.zip gebündelt.

Hier ist ein Beispiel für 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,
)
Minze
quelle
5
Wenn Sie möchten, dass nur der Interpreter nicht gebündelt wird, wählen Sie 2 für die Option bundle_files. Viel Glück!
Minze
13
Bitte beachten Sie, dass bundle_files 1 auf amd64 nicht unterstützt wird (mindestens py2exe 0.6.9 für Python 2.6)
Joril
2
@Pat: Der Aufruf zum Ausführen von py2exe lautet "python setup.py py2exe". Wenn Sie die "py2exe" am Ende automatisch anhängen, bedeutet dies nur, dass Sie sie nicht in der Befehlszeile eingeben müssen.
Orlade
2
Nicht gerade eine einzelne ausführbare Datei, da Sie die Microsoft Visual C-Laufzeit-DLL installieren müssen .
Kevin Smyth
2
Ich hatte eine Konsolenanwendung, die ich als einzelne ausführbare Datei haben wollte. Ich hatte zu ersetzen windows = [{'script': "single.py"}]mit console = ['single.py']so einem Doppelklick auf die Datei in einem CMD - Fenster öffnen in Windows würde.
Jeff B
13

Wie im anderen Poster erwähnt, generiert py2exe eine ausführbare Datei + einige zu ladende Bibliotheken. Sie können Ihrem Programm auch einige Daten hinzufügen.

Der nächste Schritt besteht darin, ein Installationsprogramm zu verwenden, um all dies in einem benutzerfreundlichen installierbaren / nicht kristallisierbaren Programm zu verpacken.

Ich habe InnoSetup ( http://www.jrsoftware.org/isinfo.php ) seit mehreren Jahren mit Freude und für kommerzielle Programme verwendet, daher empfehle ich es von Herzen.

Philippe F.
quelle
+1, um anzuzeigen, dass nach py2exe noch Dinge zu verpacken sind.
Joaquin
6

Ich konnte eine einzelne Exe-Datei mit allen in die Exe eingebetteten Ressourcen erstellen. Ich baue auf Fenstern. Das erklärt einige der os.system-Aufrufe, die ich verwende.

Zuerst habe ich versucht, alle meine Bilder in Bitmats und dann alle meine Datendateien in Textzeichenfolgen zu konvertieren. Dies führte jedoch dazu, dass die endgültige Exe sehr, sehr groß war.

Nachdem ich eine Woche lang googelt hatte, fand ich heraus, wie ich das py2exe-Skript an meine Bedürfnisse anpassen kann.

Hier ist der Patch-Link zu SourceForge, den ich eingereicht habe. Bitte poste Kommentare, damit wir ihn in die nächste Distribution aufnehmen können.

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

Dies erklärt alle vorgenommenen Änderungen. Ich habe einfach eine neue Option zur Setup-Zeile hinzugefügt. Hier ist meine setup.py.

Ich werde versuchen, es so gut wie möglich zu kommentieren. Bitte beachten Sie, dass meine setup.py komplex ist, da ich über den Dateinamen auf die Bilder zugreife. Also muss ich eine Liste speichern, um sie im Auge zu behalten.

Dies ist von einem Bildschirmschoner, den ich machen wollte.

Ich verwende exec, um mein Setup zur Laufzeit zu generieren. Es ist einfacher, es so auszuschneiden und 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])

Nervenzusammenbruch

script = py script Ich möchte mich an eine Exe wenden

icon_resources = das Symbol für die Exe

file_resources = Dateien, die ich in die exe einbetten möchte

other_resources = eine Zeichenfolge, die in die exe eingebettet werden soll, in diesem Fall eine Dateiliste.

options = py2exe Optionen zum Erstellen aller Elemente in einer exe-Datei

bitmap_strings = eine Liste der einzuschließenden Dateien

Bitte beachten Sie, dass file_resources keine gültige Option ist, bis Sie Ihre py2exe.py-Datei wie im obigen Link beschrieben bearbeiten.

Das erste Mal, dass ich versucht habe, Code auf dieser Seite zu posten, wenn ich es falsch verstehe, 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 brauchte die Magie den Zugriff auf die Bilder. Ich habe diese App ohne py2exe entwickelt und später hinzugefügt. Sie sehen also den Zugriff für beide Situationen. Wenn der Bildordner nicht gefunden werden kann, wird versucht, die Bilder aus den exe-Ressourcen abzurufen. Der Code wird es erklären. Dies ist Teil meiner Sprite-Klasse und verwendet einen DirectX. Sie können jedoch jede gewünschte API verwenden oder einfach auf 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!")

Fragen waren frei zu stellen.

Noch
quelle
Ich habe Ihre Methode ausprobiert und sie funktioniert gut, aber ich verstehe nicht, wie man der Option file_resurces eine Datei hinzufügt, um eine Datei in die EXE-Datei zu integrieren. Ich habe die Datei build_exe.py wie gesagt geändert, aber wenn ich in die Datei setup.py gehe und sie schreibe, erhalte ich einen \'file_resources': [('txt2.txt')]Fehler (die Datei, die ich in meine EXE-Datei einbetten möchte, heißt txt2 und ist eine TXT-Datei )
VinceLomba
Sie haben darüber gesprochen, wie Sie alle Ihre Bilder in Bitmats und dann alle Ihre Datendateien in Textzeichenfolgen konvertiert haben. Auch wenn Sie gesagt haben, dass es die Exe groß macht, funktioniert das und wenn ja, können Sie mir sagen, wie das geht? Ich weiß, dass diese Antwort ziemlich alt ist, aber wenn Sie antworten können, wird dies geschätzt.
Peppa
4

Sie sollten wie zuvor erwähnt ein Installationsprogramm erstellen. Obwohl es auch möglich ist, py2exe alles in einer einzigen ausführbaren Datei bündeln zu lassen, indem Sie die Option bundle_files auf 1 und das Schlüsselwortargument zipfile auf None setzen, empfehle ich dies nicht für PyGTK-Anwendungen.

Dies liegt daran, dass GTK + versucht, seine Datendateien (Lokale, Themen usw.) aus dem Verzeichnis zu laden, aus dem es geladen wurde. Sie müssen also sicherstellen, dass das Verzeichnis Ihrer ausführbaren Datei auch die von GTK + verwendeten Bibliotheken und die Verzeichnisse lib, share und etc aus Ihrer Installation von GTK + enthält. Andernfalls treten Probleme beim Ausführen Ihrer Anwendung auf einem Computer auf, auf dem GTK + nicht systemweit installiert ist.

Weitere Informationen finden Sie in meinem Handbuch zu py2exe für PyGTK-Anwendungen . Außerdem wird erklärt, wie alles außer GTK + gebündelt wird.

Sebastian Noack
quelle
1

Mir wurde gesagt, dass bbfreeze eine einzelne Datei .EXE erstellt und neuer als py2exe ist.

ℳ.
quelle
3
Soweit ich verstehen kann, erzeugt bbfreeze keine ausführbaren Dateien für einzelne Dateien. Könnten Sie Ihre Antwort dokumentieren?
Joaquin
-1

Versuchen Sie, c_x einzufrieren , um einen guten Standalone zu erstellen

Denis
quelle
cx_Freeze kann keine eigenständige ausführbare Datei erstellen. In der Dokumentation zu cx_Freeze unter buildmedia.readthedocs.org/media/pdf/cx-freeze/latest/… heißt es: "cx_Freeze unterstützt nicht das Erstellen einer einzelnen Datei-Exe, bei der alle Die Bibliotheken für Ihre Anwendung sind in eine ausführbare Datei eingebettet. " Weitere Informationen zu eigenständigen ausführbaren Dateien in cx_Freeze finden Sie in der Dokumentation ( buildmedia.readthedocs.org/media/pdf/cx-freeze/latest/… ) und in Abschnitt 4.5.
Peppa
-2

Ich habe kürzlich py2exe verwendet, um eine ausführbare Datei für die Nachprüfung zum Senden von Bewertungen an ReviewBoard zu erstellen.

Dies war die setup.py, die ich verwendet habe

from distutils.core import setup
import py2exe

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

Es wurde ein Verzeichnis erstellt, das die exe-Datei und die benötigten Bibliotheken enthält. Ich glaube nicht, dass es möglich ist, mit py2exe nur eine einzige EXE-Datei abzurufen. Wenn Sie dies benötigen, müssen Sie zuerst py2exe und dann eine Art Installationsprogramm verwenden, um die endgültige ausführbare Datei zu erstellen.

Eine Sache, auf die Sie achten müssen, ist, dass alle Eidateien, die Sie in Ihrer Anwendung verwenden, entpackt werden müssen, andernfalls kann py2exe sie nicht enthalten. Dies wird in den py2exe-Dokumenten behandelt.

David Dibben
quelle
-6

Nein, es gibt Ihnen keine einzige ausführbare Datei in dem Sinne, dass Sie danach nur noch eine Datei haben - aber Sie haben ein Verzeichnis, das alles enthält, was Sie zum Ausführen Ihres Programms benötigen, einschließlich einer exe-Datei.

Ich habe heute gerade diese setup.py geschrieben . Sie müssen nur aufrufen python setup.py py2exe.

Torsten Marek
quelle
1
Dies ist nicht korrekt. Mit den richtigen Optionen können Sie eine eigenständige Datei erhalten.
TrevorKirkby
@Torsten Marek ... der Link zu Ihrer setup.py ist tot. Insbesondere .. die ersten beiden Rederects fördern am Ende kommerzielle Sachen. Das dritte Mal endet es hier in der Sackgasse des Internets.
ZF007