2013-05-10 6 views
5

Ich entwickle ein kleines Tool auf Python, das im Grunde eine Reihe von Skripten auf einem Ordner startet. Ich muss dies auf eine eigenständige Binärdatei packen und ich verwende py2exe dafür.Wie bündle ich .py-Dateien mit execfile() auf py2exe?

Mein aktueller Code verwenden Sie os.path.listdir(), um alle .py-Dateien in einem Ordner abzurufen, und starten Sie dann einige davon mit der Funktion execfile() basierend auf Benutzereingaben auf einer PyQT-Schnittstelle.

Mein Code funktioniert wie erwartet, wenn er über die Python-Hauptdatei ausgeführt wird, schlägt jedoch fehl, wenn er mit py2exe kompiliert wird. Die Ausnahme ist:

IOError: [Errno 2] No such file or directory 

für die Python-Dateien mit execfile() ins Leben gerufen.

Ich bin derzeit mit "bundle_files": 1 und zipfile = None bündeln. Ich habe versucht, diese Dateien mit Includes und Paketen zu mischen, aber ohne Glück. Kannst du mir helfen, py2exe richtig zu konfigurieren?

Dies ist mein aktuelles setup.py:

from distutils.core import setup 
import py2exe 
import os 

#Python modules excluded from binary file 
mod_excludes = [ 
    "Tkinter", 
    "doctest", 
    "unittest", 
    "pydoc", 
    "pygments", 
    "pdb", 
    "email", 
    "_ssl", 
    "difflib", 
    "inspect" 
] 

#Avoid adding this dependencies 
dll_excludes = [ 
    "MSVCP90.dll", 
    "w9xpopen.exe" 
] 

#Force to exe 
mod_includes = [ 
    "sip" 
] 

package_includes = [ 
    "app.payloads" 
] 



py2exe_options = { 
    "optimize": 2, # 0 (None), 1 (-O), 2 (-OO) 
    "includes": mod_includes, 
    "excludes": mod_excludes, 
    "dll_excludes": dll_excludes, 
    "packages": package_includes, 
    #"xref": False, 
    "bundle_files": 1, 
    "compressed": True 
    #"dist_dir": dist_dir 
} 

#TODO generar automaticamente la interfaz 

setup(
    windows=[{"script": "app.py", 
     "icon_resources": [(1, "app/gui/Res/app.ico")], 
     "uac_info": "requireAdministrator"}], 
    data_files=exe_files, 
    options={"py2exe": py2exe_options}, 
    zipfile=None 
    ) 

Und ich erhalte die folgenden Zurückverfolgungs:

Traceback (most recent call last): 
    File "app\gui\ui.pyo", line 22, in call_report 
    File "app\core\core.pyo", line 32, in generate_report 
    File "app\core\core.pyo", line 18, in launch_payload 
IOError: [Errno 2] No such file or directory: 'C:\\Users\\my_user\\path\\to\\app\\dist\\app.exe\\app\\payloads\\autoruns.py' 
+0

Können Sie Ihren 'setup.py' Code und die Ausgabe von, wenn Sie versuchen, dies über Python/py2exe auf die Frage ausführen? –

+0

Danke Bas! Ich habe die setup.py und das Traceback hinzugefügt. – lithiium

Antwort

2

Py2exe enthält nur *.pyc Dateien (oder .pyo Dateien, wenn Sie "optimize" mehr verwenden als 0 als Sie machen). Da Sie eine Fehlermeldung nicht existierende *.py Datei erwähnt:

IOError: [Errno 2] No such file or directory: 'C:\Users\my_user\path\to\app\dist\app.exe\app\payloads\autoruns.py'

, könnte dies der Grund sein.

Im Allgemeinen würde ich empfehlen, nicht execfile() zu verwenden. Schreibe lieber dein eigenes Paket. Py2exe fügt dieses Paket automatisch hinzu, wenn Sie es irgendwo in Ihrem Anwendungscode importieren. Dieses Paket sollte die Dateien enthalten, die Sie dynamisch laden möchten. Sie können diesen Code verwenden:

my_module = __import__('my_package.module_name') 

Die Zeichenfolge 'module_name' von der Benutzereingabe über die grafische Benutzeroberfläche kommen kann.