2009-11-15 16 views
21

J'ai construit une application plutôt simple en Python 3.1 en utilisant PyQt4. En cours de réalisation, je souhaite que l'application soit distribuée aux ordinateurs sans que ceux-ci soient installés. Je m'intéresse presque exclusivement aux plates-formes Windows, donc mon but est d'avoir un seul fichier exécutable et peut-être quelques fichiers de ressources et .dlls à la fin.Création d'exécutables pour Python 3 et PyQt

Après avoir cherché autour, je suis venu à la conclusion que

  • py2exe ne supporte que Python jusqu'à la version 2.7
  • pyinstaller ne supporte que Python jusqu'à la version 2.6
  • cx_Freeze fait ne fonctionne pas pour moi parce que je continue à obtenir l'erreur suivante en essayant d'exécuter mon binaire de construction avec succès:

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'

Donc mon problème est essentiellement deux problèmes:

  1. est-il une autre façon, mais cx_Freeze pour construire les binaires avec ma configuration?
  2. Sinon, quel pourrait être le problème de cx_Freeze?

Je peux fournir plus d'informations sur le deuxième problème le cas échéant, comme mon appel cx_Freeze, mon distutils script d'installation, etc.

Merci déjà pour votre aide et commentaires.

+0

Bonne question. py2exe a été génial pour nos objectifs dans le passé. –

+0

py2exe est maintenant disponible pour Python 3 dès maintenant! –

Répondre

13

Vous pouvez résoudre ce problème en ajoutant une ligne de code à freeze.py dans votre paquet cx_Freeze.

Il est décrit ici: http://www.mail-archive.com/[email protected]/msg00212.html

Il a travaillé pour moi au moins :)

Cheers, Almar

+0

Je vais essayer dès que j'y arriverai et afficherai mes résultats. Merci pour l'instant! – WrongAboutMostThings

+0

Cela a finalement fonctionné, a dû ajouter la ligne de code que vous avez mentionnée et inclure sip. Maintenant, il reste la question de savoir comment supprimer la fenêtre de la console lors du démarrage de mon application graphique agréable. – WrongAboutMostThings

+3

Bit en retard, mais pour les futurs lecteurs, vous pouvez supprimer la fenêtre de la console en gelant avec la base Win32GUI. [Exemple ici] (http://cx_freeze.readthedocs.org/en/latest/cxfreeze_distutils.html). –

1

Pour Python 3.3 et plus tard, il y a une bonne résolution ici: py2exe - generate single executable file

Installez py2exe:

pip install py2exe 

Puis ajouter en plus fichier 'your_script.py', le fichier 'Make_exe.py' suivant:

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') 

Et si vous voulez faire 'your_script.py' se reconstruisent comme « your_script.exe 'chaque fois que vous l'exécutez en python, vous pouvez ajouter à son principal:

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...")