2013-05-10 10 views
5

Opracowuję małe narzędzie na Pythonie, które zasadniczo uruchamia zestaw skryptów w folderze. Muszę spakować to na samodzielnym pliku binarnym i używam dla niego py2exe.jak pakować pliki .py uruchamiane z execfile() na py2exe?

Mój aktualny kod używa os.path.listdir(), aby pobrać wszystkie pliki .py do folderu, a następnie uruchomić niektóre z nich za pomocą funkcji execfile() na podstawie danych wprowadzonych przez użytkownika w interfejsie PyQT.

Mój kod działa zgodnie z oczekiwaniami, jeśli jest wykonywany przez główny plik Pythona, ale kończy się niepowodzeniem po skompilowaniu z py2exe. Wyjątkiem jest:

IOError: [Errno 2] No such file or directory 

dla plików Pythona uruchomionych pod execfile().

Aktualnie jestem w pakiecie z "bundle_files": 1 i zipfile = None. Próbowałem włączyć te pliki do wiadomości z załącznikami i pakietami, ale bez powodzenia. Czy możesz mi pomóc poprawnie skonfigurować py2exe poprawnie?

To jest mój obecny 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 
    ) 

A ja otrzymuję następujący traceback:

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

Czy możesz dodać kod 'setup.py' i dane wyjściowe, gdy spróbujesz uruchomić to przez python/py2exe na pytanie? –

+0

Dzięki Bas! Dodałem setup.py i traceback. – lithiium

Odpowiedz

2

py2exe obejmuje tylko *.pyc plików (lub .pyo pliki jeśli używasz "optimize" większa niż 0 jako ty robisz). Ponieważ komunikat o błędzie wspomina non istniejący *.py plik:

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

, to może być powód.

Ogólnie nie polecam używać execfile(). Zamiast tego napisz swój własny pakiet. Py2exe będzie zawierał ten pakiet automatycznie, jeśli zaimportujesz go gdzieś w kodzie aplikacji. Ten pakiet powinien zawierać pliki, które chcesz załadować dynamicznie. Można użyć tego kodu:

my_module = __import__('my_package.module_name') 

Ciąg 'module_name' może pochodzić z wejścia użytkownika poprzez GUI.