2009-12-30 5 views
7

Tôi đang cố gắng sử dụng py2exe để phân phối ứng dụng python mà tôi đã viết. Tất cả mọi thứ dường như đi OK, nhưng khi tôi chạy nó trên máy khác nó không thành công với các lỗi sau:Py2exe - win32api.pyc ImportError Tải DLL không thành công

Traceback (most recent call last): 
    File "application.py", line 12, in <module> 
    File "win32api.pyc", line 12, in <module> 
    File "win32api.pyc", line 10, in __load 
ImportError: DLL load failed: The specified procedure could not be found. 

Tôi có googled cho điều này và không tìm thấy rất nhiều, nhưng đã cố gắng những gợi ý sau đây để avail không có:

pywintypes nhập khẩu và pythoncom trước win32api (trong setup.py cho py2exe và trong việc áp dụng chính) thêm một số mã để các setup.py -

# ModuleFinder can't handle runtime changes to __path__, but win32com uses them 
import pywintypes 
import pythoncom 
import win32api 
try: 
# if this doesn't work, try import modulefinder 
    import py2exe.mf as modulefinder 
    import win32com 
    for p in win32com.__path__[1:]: 
     modulefinder.AddPackagePath("win32com", p) 
    for extra in ["win32com.shell"]: #,"win32com.mapi" 
     __import__(extra) 
     m = sys.modules[extra] 
     for p in m.__path__[1:]: 
      modulefinder.AddPackagePath(extra, p) 
except ImportError: 
    # no build path setup, no worries. 
    pass 

tôi khá mới để tất cả điều này, vì vậy bất kỳ trợ giúp nào sẽ được đánh giá cao

Cảm ơn

Jon

Trả lời

29

Tôi đã nhìn thấy vấn đề này khi gói được xây dựng trên Vista nhưng thực hiện trên XP. Vấn đề hóa ra là py2exe nhầm thêm powrprof.dllmswsock.dll vào gói. Windows XP có chứa các bản sao riêng của các tệp này và không thể tải các tệp Vista đã được cài đặt cùng với ứng dụng của bạn.

Loại bỏ chúng ra khỏi gói đã làm các trick, bạn có thể làm điều này dễ dàng bằng cách thêm này đến options dict trong setup.py

'dll_excludes': [ "mswsock.dll", "powrprof.dll" ] 
+0

Cảm ơn bạn rất nhiều! Điều đó đã làm các trick, tất cả làm việc hoàn hảo bây giờ –

+0

Chúng tôi đã nhìn thấy điều tương tự, và powrprof.dll xuất hiện trong danh sách phụ thuộc bằng cách sử dụng công cụ Dependency Walker. Sau khi thêm nó vào 'dll_excludes', nó hoạt động tốt. – Ivo

+3

Lưu ý rằng, theo mặc định, py2exe không xóa nội dung của thư mục phân phối, vì vậy nếu trước đó bạn đã cài đặt phần mềm, các tệp 'mswsock.dll' và 'powrprof.dll' sẽ vẫn ở đó, ngay cả sau cài đặt mới (khi bạn đã thêm dòng 'dll_excludes' ở trên). Chỉ cần chắc chắn xóa thư mục phân phối trước khi chạy lại py2exe. – ishmael

0

Hãy thử thêm win32api để gói của bạn, trong từ điển tùy chọn.

Dưới đây là một ví dụ:

excludes = ["pywin", "pywin.debugger"] # there will be more in real life... 
options = dict(optimize=2, 
      dist_dir="build", 
      excludes=excludes, 
      packages=["win32api"]) 
setup(
    name="MyCoolApp", 
    options=dict(py2exe=options), 
    # etc ... 
2

@Wim, tôi thấy chút thông tin về "này thêm vào các tùy chọn Dict trong setup.py "hơi khó hiểu một chút. Nếu như tôi bạn không có tùy chọn arg trong cuộc gọi hiện tại của bạn để thiết lập điều này có thể làm cho mọi thứ rõ ràng hơn:

setup(name='myprog',  
     ... 
     options={"py2exe":{"dll_excludes":[ "mswsock.dll", "powrprof.dll" ]}}, 
     ... 
    ) 
0

Như một nhận xét bổ sung. Khi xây dựng lại chương trình của bạn với Py2exe, hãy chắc chắn xóa thư mục "dist" cũ. Tôi đã ngồi trong hơn 3 giờ không hiểu tại sao ứng dụng của tôi đang làm việc trên môi trường dev của tôi và không phải trong sản xuất. xóa dist và xây dựng lại với py2exe và nó làm việc.