2008-11-27 9 views
51

Tôi đang sử dụng python 2.6 trên XP. Tôi vừa mới cài đặt py2exe và tôi có thể tạo thành công hello.exe đơn giản từ hello.py. Tuy nhiên, khi tôi thử sử dụng py2exe trên chương trình thực sự của tôi, py2exe tạo ra một vài thông báo thông tin nhưng không tạo được bất kỳ thứ gì trong thư mục dist.py2exe không tạo được tệp thực thi

setup.py của tôi trông như thế này:

from distutils.core import setup 
import py2exe 

setup(console=['ServerManager.py']) 

và đầu ra py2exe trông như thế này:

python setup.py py2exe 
running py2exe 
creating C:\DevSource\Scripts\ServerManager\build 
creating C:\DevSource\Scripts\ServerManager\build\bdist.win32 
    ... 
    ... 
creating C:\DevSource\Scripts\ServerManager\dist 
*** searching for required modules *** 
*** parsing results *** 
creating python loader for extension 'wx._misc_' (C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_misc_.pyd -> wx._misc_.pyd) 
creating python loader for extension 'lxml.etree' (C:\Python26\lib\site-packages\lxml\etree.pyd -> lxml.etree.pyd) 
    ... 
    ... 
creating python loader for extension 'bz2' (C:\Python26\DLLs\bz2.pyd -> bz2.pyd) 
*** finding dlls needed *** 

py2exe dường như đã tìm thấy tất cả các hàng nhập khẩu của tôi (mặc dù tôi là một chút ngạc nhiên khi xem win32 được đề cập, như tôi không rõ ràng nhập khẩu nó). Ngoài ra, chương trình của tôi khởi động khá hạnh phúc với lệnh này:

python ServerManager.py 

Rõ ràng tôi đang làm một cái gì đó về cơ bản sai, nhưng trong sự vắng mặt của bất kỳ thông báo lỗi từ py2exe Tôi không có ý kiến ​​gì.

+0

Nếu có thực sự là không có đầu ra nhiều hơn, từ py2exe, đây là một trong những thực sự kỳ lạ. Thông thường nó sẽ cho bạn biết tại sao nó không thành công. Tốt nhất tôi có thể nói là có bạn đọc qua tất cả những điều này: http://www.py2exe.org/index.cgi/Py2exeAndwxPython –

+0

Charles: Đang kiểm tra cái này thường xuyên, đang bị cuốn hút vào giải pháp. Nếu bạn tìm ra nó, vui lòng đăng lại. Cảm ơn. –

Trả lời

40

Tôi đã phát hiện ra rằng py2exe hoạt động tốt nếu tôi nhận xét một phần chương trình của tôi sử dụng wxPython. Ngoài ra, khi tôi sử dụng py2exe trên mẫu 'đơn giản' mà đi kèm với tải của nó (tức là trong Python26 \ Lib \ site-packages \ py2exe \ samples \ đơn giản), tôi nhận được thông báo lỗi này:

*** finding dlls needed *** 
error: MSVCP90.dll: No such file or directory 

Vì vậy, một cái gì đó về wxPython làm cho py2exe nghĩ rằng tôi cần một Visual Studio 2008 DLL. Tôi không có VS2008, nhưng chương trình của tôi hoạt động hoàn hảo như một thư mục của các mô-đun Python. Tôi tìm thấy một bản sao của MSVCP90.DLL trên web, cài đặt nó trong Python26/DLLs, và py2exe bây giờ hoạt động tốt.

Tôi vẫn không hiểu nơi phụ thuộc này đến từ đâu, vì tôi có thể chạy mã hoàn toàn ổn mà không cần py2exe. Nó cũng gây phiền nhiễu mà py2exe đã không cho tôi một thông báo lỗi như nó đã làm với mẫu test_wx.py.

Cập nhật thêm: Khi tôi cố gắng chạy đầu ra từ py2exe trên máy tính khác, tôi phát hiện ra rằng nó cần phải có MSVCR90.DLL được cài đặt; vì vậy nếu máy tính mục tiêu của bạn không có Visual C++ 2008 đã được cài đặt, tôi khuyên bạn nên tải xuống và cài đặt Microsoft Visual C++ 2008 Redistributable Package.

+0

Tôi đã có cùng một vấn đề và áp dụng giải pháp của bạn và nó hoạt động hoàn hảo. Cám ơn vì đã chia sẻ! –

+4

Tôi gặp vấn đề tương tự với ứng dụng PyQt4. Tải xuống DLL đã giúp, cảm ơn! – kender

+6

Liên kết đến msvcp90.dll - http://www.dll-files.com/dllindex/dll-files.shtml?msvcp90 –

1

Kết quả cho biết bạn đang sử dụng WX. Hãy thử chạy py2exe với tập lệnh của bạn được chỉ định làm ứng dụng GUI thay vì giao diện điều khiển. Nếu tôi không nhầm, điều đó có xu hướng gây ra vấn đề với py2exe.

+0

Okay, setup.py của tôi bây giờ trông như thế này: từ distutils.core thiết lập nhập khẩu nhập khẩu py2exe thiết lập (cửa sổ = [{ "kịch bản": 'ServerManager.py'}]) nhưng điều đó không có hiệu lực thi hành . Tuy nhiên, tôi đã quản lý để chứng minh rằng wxPython đang gây ra sự cố. Nếu tôi không nhập wx, py2exe sẽ hoạt động hoàn hảo. –

+0

Tải xuống MSVCR90.DLL adn sao chép nó sang Python26/DLLs làm việc cho tôi! – Alex

40

tôi đặt này trong tất cả các kịch bản setup.py của tôi:

distutils.core.setup(
    options = { 
     "py2exe": { 
      "dll_excludes": ["MSVCP90.dll"] 
     } 
    }, 
    ... 
) 

Điều này sẽ giúp py2exe yên tĩnh, nhưng bạn vẫn cần phải đảm bảo rằng dll là trên máy tính của người dùng.

+5

+1: Câu trả lời này thực sự là câu trả lời đúng cho câu hỏi gốc, báo cáo vấn đề * trong khi * xây dựng với py2exe. Nó khá đúng (như đã nói trong câu trả lời của Charles) rằng bạn vẫn cần DLL để ở trên máy đích, nhưng giả sử bạn đã xử lý nó và bạn vẫn gặp lỗi này trên máy xây dựng (như tôi vừa làm) ở trên độc đáo tắt py2exe và cho phép xây dựng của bạn hoàn thành. –

+0

Điều này đã được đưa ra vấn đề của tôi trong một thời gian, chỉ cần cố gắng sửa chữa này và nó đã làm việc 100%. – rectangletangle

-2
import sys 

sys.path.append('c:/Program Files/Microsoft Visual Studio 9.0/VC/redist/x86/Microsoft.VC90.CRT') 
+0

Bạn có thể giải thích cho OP biết mã này hoạt động không? (chỉnh sửa bài đăng của bạn). Cảm ơn – Paco

6

Có vẻ như đây chỉ là phụ thuộc cho Python 2.6. Tôi đã không nhận được lỗi này dưới 2.5, nhưng sau khi nâng cấp tôi.

chủ đề email này có một số nền tảng cho lý do tại sao các vấn đề tồn tại và làm thế nào để sửa chữa nó:
http://www.nabble.com/py2exe,-Py26,-wxPython-and-dll-td20556399.html

Tôi không muốn phải cài đặt vcredist. Ứng dụng của tôi hiện không yêu cầu cài đặt và có thể được điều hành bởi những người không phải là quản trị viên, đó là hành vi mà tôi không muốn mất. Vì vậy, tôi đã làm theo các đề xuất trong các liên kết và có Microsoft.VC90.CRT.manifest và msvcr90.dll cần thiết bằng cách cài đặt Python "cho người dùng này".Tôi cũng cần msvcp90.dll mà tôi tìm thấy trong thư mục WinSxS của một "tất cả người dùng" Python 2.6 cài đặt. Kể từ khi tôi đã có hai trong ba, tôi đã bao gồm msvcm90.dll để ngăn chặn các lỗi trong tương lai mặc dù tôi đã không nhận được bất kỳ lỗi ngay lập tức khi tôi rời nó ra. Tôi đặt tệp kê khai và ba tệp DLL trong thư mục libs được ứng dụng đã đóng băng của tôi sử dụng.

Bí quyết tôi phải thực hiện là bao gồm một bản sao bổ sung của tệp kê khai và msvcr90.dll trong thư mục gốc của thư mục ứng dụng của tôi bên cạnh py2exe được tạo. Bản sao của DLL này được sử dụng để khởi động ứng dụng, nhưng sau đó nó xuất hiện để chỉ tìm trong thư mục libs.

Hy vọng rằng khám phá sẽ giúp người khác ra ngoài.

Ngoài ra, tôi có cùng một vấn đề với việc py2exe đăng nhập một thông báo lỗi thực sự. Sau đó, tôi nhận ra rằng stderr đã không được chuyển hướng vào tập tin đăng nhập của tôi. Thêm "> build.log 2> & 1" trên dòng lệnh nơi bạn gọi py2exe.

+1

Như được ghi trong chủ đề này: http: // stackoverflow.com/questions/1570542/giải pháp của tôi không thông minh như tôi nghĩ; nó dẫn đến các lỗi khác. Tôi sẽ phải cài đặt vcredist. Arg – resplin

+2

Tôi nói rằng bạn vẫn thông minh. Có lẽ nó không hoạt động với một ứng dụng sử dụng SQLite, nhưng tôi đã thử mẹo thêm 3 dll và tệp kê khai vào thư mục thời gian chạy. Điều này cho phép ứng dụng Python26/py2exe khá đơn giản của tôi chạy đúng mà không có lỗi và không cần phải cài đặt vc_redist trên máy (Win2003 Server), mà tôi không thể thực hiện trên máy của khách hàng. Werner F. Bruhin có thêm chi tiết về giải pháp đơn giản này tại đây: http://sourceforge.net/mailarchive/message.php?msg_name=hlav67%24627%241%40ger.gmane.org –

3

Chỉ cần cho thông tin của bạn, đối với tôi nó làm việc để sao chép các tập tin

Microsoft.VC90.CRT.manifest MSVCR90.DLL

vào thư mục với .exe trên máy tính của người dùng (người có không cần cài đặt lại python hoặc VC.

Cảm ơn tất cả các gợi ý tại đây!

+1

Tôi chỉ muốn nói rằng Tên Microsoft.VC90.CRT.manifest là rất quan trọng. Tệp kê khai của tôi được đặt tên là x86_Microsoft.VC90.CRT_1fc8b3b9 ..._ 9.0.21022.8_x-ww_d08 ..... biểu hiện và nó đã cho tôi một số nhức đầu tự hỏi tại sao nó không hoạt động. Cảm ơn! –

10

wxPython không liên quan gì đến nó. Trước Python 2.6, Python đã sử dụng Visual Studio 2003 làm trình biên dịch Windows của họ. Bắt đầu với phiên bản 2.6, họ chuyển sang Visual Studio 2008, yêu cầu tệp kê khai trong một số trường hợp. Điều này đã được ghi nhận. Xem các liên kết sau đây:

http://wiki.wxpython.org/py2exe

http://py2exe.org/index.cgi/Tutorial#Step52

Ngoài ra, nếu bạn đang tạo một ứng dụng wxPython với py2exe, sau đó bạn muốn thiết lập các cửa sổ thông số, không những một giao diện điều khiển. Có lẽ hướng dẫn của tôi sẽ giúp bạn:

http://www.blog.pythonlibrary.org/2010/07/31/a-py2exe-tutorial-build-a-binary-series/

6
import sys 

sys.path.append('C:\\WINDOWS\\WinSxS\\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4148_none_5090ab56bcba71c2') 

Trên mỗi Windows, bạn có thể tìm thấy các tập tin MSVCP90.dll trong một số thư mục con trong C:\\WINDOWS\\WinSxS\\

Trong trường hợp của tôi, thư mục là: x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4148_none_5090ab56bcba71c2.

Đi tới C:\\WINDOWS\\WinSxS\\ và sử dụng tìm kiếm tệp windows để tìm MSVCP90.dll.

+0

cảm ơn nó đã giúp – sam

-1

On win8 tôi.1, tôi không tìm thấy con đường

c:/Program Files/Microsoft Visual Studio 9.0/VC/redist/x86/Microsoft.VC90.CRT

Ngược lại, dll được tìm thấy trong

C: /WINDOWS/WinSxS/x86_Microsoft.VC90.CRT_XXXXXXX

XXX có thể thay đổi tùy theo máy tính của bạn

Bạn có thể tìm kiếm trong đường dẫn, sau đó thêm các đường dẫn trong bạn setup.py

import sys 
sys.path.append('C:/WINDOWS/WinSxS/x86_Microsoft.VC90.CRT_XXXXXXX')