2009-07-20 27 views
7

Tôi rất mới đối với Python nói chung, nhưng tôi đã tạo một ứng dụng bằng Python 2.6/wxPython 2.8 hoạt động hoàn hảo khi tôi chạy nó thông qua Python. Nhưng tôi muốn đi một bước xa hơn và có thể triển khai nó như là một thực thi Windows, vì vậy tôi đã cố gắng ra py2exe. Nhưng tôi đã không thể làm cho nó hoạt động được. Nó sẽ luôn luôn biên dịch một exe, nhưng khi tôi thực sự cố gắng chạy nó nó barks một số thông báo lỗi khó hiểu. Lúc đầu, họ là thông điệp đơn giản nói rằng nó không thể tìm thấy một số DLL, nhưng ngay cả sau khi cho nó tất cả các DLL nó muốn, bây giờ nó sẽ trả về này:Làm cách nào để gỡ lỗi ứng dụng py2exe 'không thể khởi chạy đúng'?

The application failed to initialize properly (0xc0000142). 
Click OK to terminate the application. 

Vì vậy, tôi đã phá vỡ mọi thứ xuống và chỉ cần thực hiện một rất, rất ứng dụng đơn giản sử dụng wxPython chỉ để xem liệu điều đó có hiệu quả không, hoặc nếu một số tính năng phức tạp hơn của ứng dụng gốc của tôi đã bị cản trở. Nhưng ngay cả thử nghiệm đơn giản của tôi cũng trả về cùng một lỗi. Dưới đây là các mã cho các kịch bản thử nghiệm đơn giản:

import wx 

class MainWindow(wx.Frame): 

    def __init__(self, parent, id, title): 
     wx.Frame.__init__(self, parent, wx.ID_ANY, title, style=wx.DEFAULT_FRAME_STYLE^wx.MAXIMIZE_BOX) 
     panel = wx.Panel(self, -1, style = wx.TAB_TRAVERSAL | wx.CLIP_CHILDREN | wx.FULL_REPAINT_ON_RESIZE) 
     main_sizer = wx.BoxSizer(wx.VERTICAL) 

     testtxt = wx.StaticText(panel, -1, label='This is a test!') 
     main_sizer.Add(testtxt, 0, wx.ALIGN_CENTER) 

     panel.SetSizerAndFit(main_sizer) 
     self.Show(1) 
     return 

app = wx.PySimpleApp() 
frame = MainWindow(None, -1, 'Test App') 
app.MainLoop() 

và đây là kịch bản cài đặt py2exe tôi đã sử dụng:

#!/usr/bin/python 

from distutils.core import setup 
import py2exe 

manifest = """ 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" 
manifestVersion="1.0"> 
<assemblyIdentity 
    version="0.64.1.0" 
    processorArchitecture="x86" 
    name="Controls" 
    type="win32" 
/> 
<description>Test Program</description> 
<dependency> 
    <dependentAssembly> 
     <assemblyIdentity 
      type="win32" 
      name="Microsoft.Windows.Common-Controls" 
      version="6.0.0.0" 
      processorArchitecture="X86" 
      publicKeyToken="6595b64144ccf1df" 
      language="*" 
     /> 
    </dependentAssembly> 
</dependency> 
</assembly> 
""" 

setup(
    windows = [ 
     { 
      "script": "testme.py", 
      "icon_resources": [(1, "testme.ico")], 
      "other_resources": [(24,1, manifest)] 
     } 
    ], 
    data_files=["testme.ico"] 

)

Sau đó, tôi chạy python setup.py py2exe, nó tạo ra các tập tin EXE, cảnh báo về một số tập tin DLL (mà sau đó tôi sao chép vào thư mục dist), nhưng sau đó khi tôi cố gắng chạy EXE, tôi nhận được lỗi tôi trích dẫn ở trên ngay lập tức.

+1

-1: Tiêu đề câu hỏi đáng sợ. Có lẽ điều này nên là: "Làm cách nào để gỡ lỗi ứng dụng py2exe 'không thể khởi chạy đúng' lỗi?" –

+1

Xin lỗi về tiêu đề, S.Lott. Nó bây giờ đã được thay đổi. – SoaperGEM

Trả lời

10

Lưu ý rằng có phiên bản sau của gói Visual C++ 2008 Redistributable: SP1. Tuy nhiên, cả bản SP1 và bản phát hành trước đó đều không cài đặt các tệp DLL vào đường dẫn.Như các trang download nói (tôi nhấn mạnh):

This package installs runtime components of C Runtime (CRT), Standard C++, ATL, MFC, OpenMP and MSDIA libraries. For libraries that support side-by-side deployment model (CRT, SCL, ATL, MFC, OpenMP) they are installed into the native assembly cache, also called WinSxS folder, on versions of Windows operating system that support side-by-side assemblies.

Có thể bạn sẽ tìm thấy những tập tin trong thư mục %WINDIR%\WinSxS và không nằm trong path.What Tôi nghĩ rằng bạn cần phải làm là kết hợp các thông tin manifest cho các file DLL có liên quan (được tìm thấy trong số %WINDIR%\WinSxS\Manifests) vào số setup.py của bạn. Tôi thêm phần sau:

<dependency> 
    <dependentAssembly> 
     <assemblyIdentity 
      type="win32" 
      name="Microsoft.VC90.CRT" 
      version="9.0.30729.4918" 
      processorArchitecture="X86" 
      publicKeyToken="1fc8b3b9a1e18e3b" 
      language="*" 
     /> 
    </dependentAssembly> 
</dependency> 

ngay sau phần hiện <dependency>, và xây dựng lại các exe: nó chạy không có vấn đề. Lưu ý: tùy thuộc vào chính xác phiên bản của tệp Visual C++ mà bạn đã cài đặt, thông tin trên có thể không chính xác. Nhìn vào biểu hiện trên hệ thống của bạn và sử dụng đúng version, publicKeyToken, vv

Tương tự nhìn vào this answer cho làm thế nào để triển khai các DLL với ứng dụng của bạn (như trái ngược với giả định họ đã tồn tại trên hệ thống mục tiêu). Oh ... Tôi thấy bạn hỏi rằng câu hỏi gốc ;-)

+0

Thêm rằng ' 'đã làm điều đó! Cảm ơn bạn rất nhiều! – SoaperGEM

+0

Nhân tiện, được cung cấp một tệp DLL, làm thế nào để bạn tìm thấy publicKeyToken cho nó? Ví dụ, tôi thực sự có phiên bản 9.0.30729.1 của DLL ở trên; làm thế nào tôi sẽ đi về nhận được publicKeyToken thích hợp cho nó? – SoaperGEM

+2

Tìm trong thư mục Manifests mà tôi đã đề cập trước đó cho tệp kê khai cụ thể mà bạn cần. –

0

Tôi đã sử dụng py2exe trước và tôi đã không bao giờ chạy ngang qua một tình huống như thế này ....

Tuy nhiên, có vẻ như thiếu phụ thuộc là vấn đề của bạn .....

Liệu chương trình đóng gói hoạt động trên máy của bạn chứ không phải trên máy khác?

Nếu có, hãy chạy ứng dụng đóng gói trong DEPENDS (bộ phụ thuộc) trên cả hai máy và so sánh với hy vọng phân biệt gói nào không được đưa vào.

Chúc may mắn

+0

Bởi "chương trình đóng gói" bạn có nghĩa là exe được tạo ra? Hoặc chỉ chạy kịch bản trực tiếp thông qua Python? Dù sao, nếu tôi chạy 'python testme.py' từ dòng lệnh, nó hoạt động tốt. Nhưng điểm chạy này thông qua py2exe là tôi muốn có thể triển khai nó vào các máy tính * không * có cài đặt Python. Nhưng ngay bây giờ nó không làm việc trên * bất kỳ * máy tính, Python hay không, khi tôi biên dịch nó với py2exe. – SoaperGEM

+0

Chương trình đóng gói = Exe được tạo. Các exe nên chạy tốt trên máy sản xuất nó. Chạy nó trên máy đó với bộ khung phụ thuộc để xem danh sách các thư viện được tải xuống rõ ràng. Sau đó quay lại và thực hiện thao tác này trên máy không thành công. Sự khác biệt sẽ chỉ cho bạn một giải pháp. – CMB

+0

Đó là điểm của tôi tất cả cùng ... chương trình đóng gói * KHÔNG * chạy tốt trên máy sản xuất nó. Do đó tiêu đề. – SoaperGEM

0

Bạn không được phép sao chép TẤT CẢ các .dll mà nó phàn nàn! Một số trong số đó là các tệp hệ thống Windows và chúng có mặt ở những vị trí chính xác trên hệ thống. Nếu bạn sao chép chúng vào thư mục dist, mọi thứ sẽ không hoạt động chính xác.

Nói chung, bạn chỉ muốn sao chép .dlls dành riêng cho ứng dụng của mình. Không phải hệ thống .dll. Trong một số trường hợp, bạn có thể cần phải gửi vcredist_xx.exe trong trình cài đặt của bạn để có được thời gian chạy MSVC trên hệ thống. Bạn không bao giờ nên cố gắng gửi những tập tin .dll "thô" của chính mình. Sử dụng gói redist, nó sẽ giúp bạn tiết kiệm thời gian và thất vọng.

Bạn đã thử làm theo các hướng dẫn tại đây: http://wiki.wxpython.org/SmallApp?

+0

Tôi đã thử các hướng dẫn đó và đây là những gì đã xảy ra. 1. Đã thử chạy 'python setup.py py2exe --icon = SmallApp.ico', đã nhận được lỗi này:' error: option --icon not recogn'. 2. Đã thử chạy 'python setup.py py2exe', có lỗi này:' error: error trong setup.cfg: lệnh 'py2exe' không có tùy chọn 'version_legalcopyright''. 3. Xóa file setup.cfg và thử chạy lại 'python setup.py py2exe', py2exe * xuất hiện * để chạy tốt, nó tạo ra các thư mục build và dist với các file trong chúng - ngoại trừ nó không tạo ra một file EXE trong dist! (không chỉ là w9xpopen.exe, mà không có gì một mình) – SoaperGEM

+0

4. Đã sửa đổi thiết lập.py tập tin trong các hướng để thay thế phù hợp với một trong tôi đăng ở trên trong câu hỏi ở đây (ngoại trừ thay đổi tài liệu tham khảo từ 'testme' để' smallapp'), và nó biên dịch tốt, sản xuất một EXE tốt, nhưng EXE nó tạo ra có chính xác giống nhau lỗi: Ứng dụng không thể khởi chạy đúng. – SoaperGEM

+0

Không chắc chắn nếu đây là trường hợp khi câu trả lời đã được đăng, nhưng hiện tại các dll redistributable VC không được coi là tập tin hệ thống và nên được phân phối song song với các ứng dụng sử dụng chúng: http://support.microsoft .com/kb/326922 – hexedpackets

0

Bạn có chắc chắn rằng bạn cung cấp cùng một dll mà tệp được sử dụng bởi wxPython.

Tệp vC++ dll được sử dụng bởi wxpython có thể được tải xuống từ trang tải xuống wxpython. Bạn đã thử cái này chưa?

+0

Khi tôi cố gắng chạy EXE mà không sao chép DLL, tôi thực sự gặp phải lỗi này: Ứng dụng này đã không khởi động được vì không tìm thấy MSVCR90.dll. Cài đặt lại ứng dụng có thể khắc phục sự cố này. Sau đó, tôi sao chép msvcr90.dll vào thư mục dist và nhận được lỗi "ứng dụng không khởi tạo đúng" được đề cập ở trên. AFAIK, DLL này là từ gói VC++. – SoaperGEM

+0

Bạn cũng cài đặt gói Visual C++ redistruable? – luc

+0

Có, tôi đã làm - đặc biệt là tôi đã cài đặt gói [2008] (http://www.microsoft.com/downloads/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&displaylang=en) trước khi tôi đăng câu hỏi. – SoaperGEM

1

Câu hỏi của bạn là: Làm thế nào để gỡ lỗi py2exe

Đây là một mẹo:

Đối với vấn đề cụ thể của bạn, tôi hy vọng rằng bạn sẽ tìm thấy giải pháp về chuỗi hoàn chỉnh hơn này xử lý cùng một vấn đề:

py2exe fails to generate an executable

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