Question

Je construit une application plutôt simple dans Python 3.1 en utilisant PyQt4. Être fait, je veux l'application à distribuer aux ordinateurs sans soit de ceux installés.

Je presque exclusivement sur les plates-formes Windows soucie, donc mon objectif est d'avoir un seul fichier exécutable et peut-être certains fichiers de ressources et .DLLs à la fin.

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

  • py2exe ne supporte que jusqu'à Python version 2.7
  • pyinstaller ne supporte que jusqu'à Python version 2.6
  • cx_Freeze ne fonctionne pas pour moi parce que je continue à obtenir l'erreur suivante lorsque vous essayez d'exécuter mon succès binaire construire:

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 ici:

  1. Y at-il une autre façon, mais cx_Freeze pour construire les binaires avec ma configuration?
  2. Dans le cas contraire, ce qui pourrait le problème de cx_Freeze être?

Je peux fournir plus d'informations sur le deuxième problème si nécessaire, comme mon appel de cx_Freeze, mon distutils script d'installation, etc.

Merci déjà pour votre aide et commentaires.

Était-ce utile?

La solution

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

Il est décrit ici: http://www.mail-archive.com /cx-freeze-users@lists.sourceforge.net/msg00212.html

Il a travaillé pour moi au moins:)

Cordialement,   Almar

Autres conseils

Pour Python 3.3 et plus tard, il y a une bonne résolution ici: py2exe - générer fichier exécutable unique

Installer py2exe:

pip install py2exe

Ensuite, ajoutez 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 reconstruire comme « your_script.exe » chaque fois que vous l'exécutez en python , vous pouvez ajouter à sa principale :

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...")
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top