2013-05-10 23 views
5

Tôi đang phát triển một công cụ nhỏ trên Python về cơ bản sẽ khởi chạy một tập hợp các tập lệnh trên một thư mục. Tôi cần phải gói này trên một nhị phân độc lập và tôi đang sử dụng py2exe cho nó.cách gói các tệp .py được khởi chạy với execfile() trên py2exe?

Mã hiện tại của tôi sử dụng os.path.listdir() để nhận tất cả các tệp .py trên một thư mục rồi khởi chạy một số tệp bằng cách sử dụng execfile() funcion dựa trên đầu vào của người dùng trên giao diện PyQT.

Mã của tôi hoạt động như mong đợi nếu được thực thi thông qua tệp Python chính, nhưng không thành công khi được biên dịch bằng py2exe. Ngoại lệ là:

IOError: [Errno 2] No such file or directory 

cho các tệp trăn được khởi chạy với execfile().

Tôi hiện đang nhóm với "bundle_files": 1zipfile = None. Tôi đã cố gắng bao gồm những tập tin này rối tung với bao gồm và các gói nhưng không có may mắn. Bạn có thể giúp tôi cấu hình py2exe đúng cách không?

Đây là của tôi hiện tại 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 
    ) 

Và tôi nhận được traceback sau:

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

Bạn có thể thêm mã 'setup.py' của mình và đầu ra từ khi bạn cố gắng chạy mã này thông qua python/py2exe đối với câu hỏi không? –

+0

Cảm ơn Bas! Tôi đã thêm setup.py và traceback. – lithiium

Trả lời

2

py2exe chỉ bao gồm *.pyc file (hoặc .pyo file nếu bạn sử dụng "optimize" lớn hơn 0 là bạn làm). Vì thông báo lỗi của bạn đề cập đến tệp không tồn tại *.py:

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

, đây có thể là lý do.

Nói chung, tôi khuyên bạn không nên sử dụng execfile(). Thay vì viết gói của riêng bạn. Py2exe sẽ tự động bao gồm gói này nếu bạn nhập nó vào đâu đó trong mã ứng dụng của bạn. Gói này nên chứa các tệp bạn muốn tải động. Bạn có thể sử dụng mã này:

my_module = __import__('my_package.module_name') 

Chuỗi 'module_name' có thể đến từ đầu vào người dùng thông qua giao diện đồ họa.

Các vấn đề liên quan