it-swarm.com.de

py2exe - Erzeugt eine einzelne ausführbare Datei

Ich dachte, ich hätte gehört, dass py2exe das konnte, aber ich habe es nie herausgefunden. Hat das jemand 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 so etwas wie in maybe/temp entpackt und ausführt.

136
Greg

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

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

99
dF.

Verwenden Sie dazu mit py2exe die Option bundle_files in Ihrer Datei setup.py. Für eine einzelne Datei möchten Sie bundle_files auf 1, compressed auf True und setzen Sie die Option zipfile auf None. Auf diese Weise wird eine komprimierte Datei für die einfache Verteilung erstellt.

Hier finden Sie eine vollständigere Beschreibung der Option bundle_file, die direkt von der py2exe-Site * zitiert wird.

Verwendung 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 festzulegen. 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ündeln Sie alles, einschließlich des Python Interpreters

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

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

Wie bereits erwähnt, generiert py2exe eine + ausführbare Datei sowie 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 ein einfach zu verwendendes installierbares/nicht kristallisierbares Programm zu packen.

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

13
Philippe F

Sie sollten, wie bereits erwähnt, ein Installationsprogramm erstellen. Obwohl es auch möglich ist, py2exe alles in eine einzige ausführbare Datei bündeln zu lassen, indem Sie die Option bundle_files auf 1 und das Schlüsselwort zipfile auf None setzen, wird dies für PyGTK-Anwendungen nicht empfohlen.

Das liegt daran, dass GTK + versucht, seine Datendateien (Locals, Themes 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 GTK + -Installation 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 Anleitung zu py2exe für PyGTK-Anwendungen . Es wird auch erklärt, wie Sie alles außer GTK + bündeln.

4
Sebastian Noack

Ich konnte eine einzige exe-Datei mit allen in die exe eingebetteten Ressourcen erstellen. Ich baue an 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. aber das führte dazu, dass die endgültige exe sehr sehr groß war.

Nach einer Woche googeln habe ich herausgefunden, 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=31558

dies erklärt alle vorgenommenen Änderungen. Ich habe der Setup-Zeile einfach eine neue Option 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, weil ich über den Dateinamen auf die Bilder zugreife. Ich muss also eine Liste speichern, um den Überblick zu behalten.

das ist von einem Bildschirmschoner, den ich machen wollte.

Ich benutze 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 Icon für die Exe

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

other_resources = ein String, der in die exe eingebettet werden soll, in diesem Fall eine Dateiliste.

options = py2exe Optionen zum Erstellen aller Elemente in einer einzigen 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.

zum ersten Mal habe ich versucht, Code auf dieser Website zu veröffentlichen. Wenn ich etwas falsch mache, 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 wars für das setup.py jetzt brauchte die magie den zugriff auf die bilder. Ich habe diese App ohne py2exe entwickelt und später hinzugefügt. So sehen Sie den Zugriff für beide Situationen. Wenn der Bildordner nicht gefunden wird, wird versucht, die Bilder aus den exe-Ressourcen zu ziehen. Der Code wird es erklären. Dies ist Teil meiner Sprite-Klasse und verwendet ein 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!")

Bei Fragen stehen wir Ihnen gerne zur Verfügung.

4
Nor

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

1
ℳ  .