2013-05-10 199 views
5

我正在開發一個基於Python的小工具,它基本上在文件夾上啓動一組腳本。我需要將它打包在一個獨立的二進制文件中,我使用py2exe。如何捆綁在py2exe上使用execfile()啓動的.py文件?

我的當前代碼使用os.path.listdir()獲取文件夾中的所有.py文件,然後使用execfile()函數根據用戶在PyQT界面上的輸入啓動其中的一些文件。

如果通過主Python文件執行,我的代碼將按預期工作,但在使用py2exe編譯時失敗。例外情況是:

IOError: [Errno 2] No such file or directory 

對於使用execfile()啓動的python文件。

我目前與"bundle_files": 1zipfile = None捆綁在一起。我試圖將這些文件與includes和packages混淆,但沒有運氣。你能幫我正確配置py2exe嗎?

這是我目前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 
    ) 

而且我得到以下回溯:如果您使用"optimize"大於0爲

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

你可以添加你的'setup.py'代碼和當你試圖通過python/py2exe運行這個問題的輸出嗎? – 2013-05-10 14:27:15

+0

謝謝Bas!我已經添加了setup.py和追蹤。 – lithiium 2013-05-10 14:37:48

回答

2

Py2exe僅包括*.pyc文件(或文件.pyo你做)。既然你錯誤信息提到一個不存在*.py文件:

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

,這可能是原因。

一般來說,我會建議不要使用execfile()。而是寫你自己的軟件包。如果您將Py2exe導入應用程序代碼的某處,Py2exe會自動包含此軟件包。這個軟件包應該包含你想要動態加載的文件。您可以使用此代碼:

my_module = __import__('my_package.module_name') 

字符串'module_name'可以來自通過GUI的用戶輸入。