Domanda

Ho costruito un piuttosto semplice applicazione in Python 3.1 utilizzando PyQt4. Stato fatto, voglio l'applicazione da distribuire ai computer senza che nessuno di quelli installati.

mi interessa quasi esclusivamente su piattaforme Windows, quindi il mio obiettivo è quello di avere un unico file eseguibile e forse alcuni file di risorse e file .dll alla fine.

Dopo aver cercato in giro, sono arrivato alla conclusione che

  • py2exe supporta solo Python fino alla versione 2.7
  • pyinstaller supporta solo Python fino alla versione 2.6
  • cx_Freeze non funziona per me, perché io continuo a ottenere il seguente errore quando si tenta di eseguire il mio costruire con successo binario:

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'

Quindi il mio problema è fondamentalmente due problemi qui:

  1. C'è un altro modo, ma cx_Freeze per costruire i binari con la mia configurazione?
  2. Se no, che potrebbe essere il problema cx_Freeze?

posso fornire ulteriori informazioni sul secondo problema, se necessario, come il mio richiamo di cx_Freeze, miei distutils l'installazione di script, ecc.

Grazie già per il vostro aiuto e commenti.

È stato utile?

Soluzione

È possibile risolvere questo problema aggiungendo una riga di codice per freeze.py nel pacchetto cx_Freeze.

E 'descritto qui: http://www.mail-archive.com /cx-freeze-users@lists.sourceforge.net/msg00212.html

Ha funzionato per me almeno:)

Saluti,   Almar

Altri suggerimenti

Per Python 3.3 e più tardi, c'è una buona risoluzione qui: py2exe - generare unico file eseguibile

Installa py2exe:

pip install py2exe

Quindi aggiungere oltre a file 'your_script.py', il seguente file 'Make_exe.py':

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

E se si vuole fare 'your_script.py' ricostruirsi come 'your_script.exe' ogni volta che si esegue in python , è possibile aggiungere alla sua 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...")
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top