2009-11-15 15 views
21

Ich habe eine einfache Anwendung in Python 3.1 mit PyQt4 erstellt. Wenn ich fertig bin, möchte ich, dass die Anwendung auf Computer verteilt wird, ohne dass beide installiert sind.Erstellen von ausführbaren Dateien für Python 3 und PyQt

Ich interessiere mich fast ausschließlich für Windows-Plattformen, so ist mein Ziel, eine einzelne ausführbare Datei und vielleicht einige Ressourcen-Dateien und .dlls am Ende zu haben.

um gesucht haben, ich kam zu dem Schluss, dass

  • py2exe Python unterstützt nur bis zur Version 2.7
  • pyinstaller unterstützt nur Python bis zur Version 2.6
  • cx_Freeze tut funktioniert nicht für mich, weil ich weiterhin den folgenden Fehler bekomme, wenn ich versuche, meine erfolgreich aufgebaute Binärdatei auszuführen:

Y:\Users\lulz\build\exe.win32-3.1>system_shutdown.exe
Traceback (most recent call last):
File "Y:\Program Files (x86)\Python\lib\site-packages\cx_Freeze\initscripts\Console3.py", line 27, in exec(code, m.__dict__)
File "Y:/Users/lulz/Documents/Coding/Python3/projects/System Shutdown/system_shutdown.pyw", line 5, in from PyQt4 import QtCore
File "ExtensionLoader_PyQt4_QtCore.py", line 16, in AttributeError: 'NoneType' object has no attribute 'modules'

Also mein Problem ist im Grunde zwei Probleme:

  1. Gibt es eine andere Art und Weise aber cx_Freeze zu Binärdateien mit meiner Konfiguration zu bauen?
  2. Wenn nicht, was könnte das cx_Freeze Problem sein?

kann ich weitere Informationen über das zweite Problem bei Bedarf zur Verfügung stellen, wie mein Ruf cx_Freeze, mein distutils Setup-Skript usw.

Danke schon für Ihre Hilfe und Kommentare.

+0

Gute Frage. py2exe war in der Vergangenheit großartig für unsere Zwecke. –

+0

py2exe ist ab sofort für Python 3 verfügbar! –

Antwort

13

Sie können dies beheben, indem Sie eine Zeile Code an freeze.py in Ihrem cx_Freeze-Paket anhängen.

Es ist hier beschrieben: http://www.mail-archive.com/[email protected]/msg00212.html

Es funktionierte für mich zumindest :)

Cheers, Almar

+0

Ich werde dies versuchen, sobald ich dazu komme und meine Ergebnisse posten. Danke bis jetzt! – WrongAboutMostThings

+0

Dies hat schließlich funktioniert, musste die Codezeile hinzufügen, die Sie erwähnt haben und schlucke. Jetzt ist die Frage, wie das Konsolenfenster beim Starten meiner schönen GUI-Anwendung unterdrückt werden kann. – WrongAboutMostThings

+3

Bis spät, aber für zukünftige Leser können Sie das Konsolenfenster unterdrücken, indem Sie mit der Win32GUI-Basis einfrieren. [Beispiel hier] (http://cx_freeze.readthedocs.org/en/latest/cxfreeze_distutils.html). –

1

für Python 3.3 und später, gibt es eine gute Auflösung hier: py2exe - generate single executable file

Installieren py2exe:

pip install py2exe 

dann neben 'your_script.py' Datei hinzufügen, die folgende 'Make_exe.py' file:

from distutils.core import setup 
import py2exe, sys 

class Make_exe(): 
    def __init__(self, python_script): 
     sys.argv.append('py2exe') 

     setup(
      console=[{'script': python_script}], 
      zipfile = None, 
      options={ 
       'py2exe': 
       { 
        'bundle_files': 1, 
        'compressed': True, 
        # Add includes if necessary, e.g. 
        'includes': ['lxml.etree', 'lxml._elementpath', 'gzip'], 
       } 
      } 
     ) 

if __name__ == '__main__': 
    Make_exe('your_script.py') 

Und wenn Sie wollen, machen 'your_script.py' Wiederaufbau selbst als ‚your_script.exe "jedes Mal, wenn Sie es in python laufen, können Sie zu seiner Haupt hinzufügen:

import subprocess 
import sys 

if __name__ == '__main__': 
    currentFile = sys.argv[0] 
    if currentFile.lower().endswith(".py"): 
     exitCode = subprocess.call("python Make_exe.py") 
     if exitCode==0 : 
      dirName = os.path.dirname(currentFile) 
      exeName = os.path.splitext(os.path.basename(currentFile))[0] + '.exe' 
      exePath = dirName + "/dist/" + exeName 
      cmd = [exePath] + sys.argv[1:] 
      print ("Executing command:\n %s" % cmd) 
      exitCode = subprocess.call(cmd) 
     sys.exit(exitCode) 
    else: 
     print ("This will be executed only within the new generated EXE File...")