py2exe не может создать исполняемый файл

Я использую Python 2.6 на XP. Я только что установил py2exe, и я могу успешно создать простой hello.exe из hello.py. Однако, когда я пытаюсь использовать py2exe в моей реальной программе, py2exe выдает несколько информационных сообщений, но не может генерировать что-либо в папке dist.

Мой setup.py выглядит так:

from distutils.core import setup
import py2exe

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

и вывод py2exe выглядит так:

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, кажется, нашел все мои импортные данные (хотя я был немного удивлен, увидев упомянутый win32, поскольку я не импортирую его явно). Кроме того, моя программа запускается довольно счастливо с этой командой:

python ServerManager.py

Очевидно, что я делаю что-то в корне неправильно, но в отсутствие каких-либо сообщений об ошибках от py2exe я понятия не имею, что.

11 ответов

Решение

Я обнаружил, что py2exe прекрасно работает, если я закомментирую часть моей программы, которая использует wxPython. Кроме того, когда я использую py2exe в "простом" образце, который поставляется с его загрузкой (то есть в Python26\Lib\site-packages\py2exe\samples\simple), я получаю следующее сообщение об ошибке:

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

Так что что-то в wxPython заставляет py2exe думать, что мне нужна DLL-библиотека Visual Studio 2008. У меня нет VS2008, и все же моя программа отлично работает как каталог модулей Python. Я нашел копию MSVCP90.DLL в сети, установил ее в Python26/DLLs, и теперь py2exe работает нормально.

Я до сих пор не понимаю, откуда взялась эта зависимость, так как я могу нормально выполнять свой код без py2exe. Также раздражает, что py2exe не выдает мне сообщение об ошибке, как это было с примером test_wx.py.

Дальнейшее обновление: когда я попытался запустить вывод из py2exe на другом ПК, я обнаружил, что на нем должна быть установлена ​​MSVCR90.DLL; поэтому, если на вашем целевом ПК не установлена ​​Visual C++ 2008, я рекомендую вам загрузить и установить распространяемый пакет Microsoft Visual C++ 2008.

Я вставил это во все мои скрипты setup.py:

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

Это сохраняет py2exe тихо, но вам все равно нужно убедиться, что dll находится на компьютере пользователя.

wxPython не имеет к этому никакого отношения. До Python 2.6 Python использовал Visual Studio 2003 в качестве компилятора Windows. Начиная с версии 2.6, они перешли на Visual Studio 2008, для которой в некоторых ситуациях требуется файл манифеста. Это было хорошо задокументировано. Смотрите следующие ссылки:

http://wiki.wxpython.org/py2exe

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

Кроме того, если вы создаете приложение wxPython с py2exe, вы хотите установить параметр windows, а НЕ консольный. Может быть, мой учебник поможет вам:

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

import sys

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

На каждой Windows вы можете найти файл MSVCP90.dll в каком-то подкаталоге в C:\\WINDOWS\\WinSxS\\

В моем случае каталог был: x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4148_none_5090ab56bcba71c2,

Идти к C:\\WINDOWS\\WinSxS\\ и использовать поиск файлов Windows, чтобы найти MSVCP90.dll,

Похоже, что это только зависимость для Python 2.6. Я не получил эту ошибку под 2.5, но после обновления я.

Эта ветка электронной почты имеет некоторые сведения о том, почему проблема существует и как ее исправить:
http://www.nabble.com/py2exe,-Py26,-wxPython-and-dll-td20556399.html

Я не хотел устанавливать vcredist. Мое приложение в настоящее время не требует установки и может быть запущено не администраторами, это поведение, которое я не хочу терять. Поэтому я последовал советам в ссылках и получил необходимые файлы Microsoft.VC90.CRT.manifest и msvcr90.dll, установив Python "только для этого пользователя". Мне также понадобился файл msvcp90.dll, который я нашел в папке WinSxS для установки всех пользователей Python 2.6. Так как у меня уже было два из трех, я включил msvcm90.dll, чтобы предотвратить будущие ошибки, хотя я не получил немедленных ошибок, когда не учел их. Я поместил манифест и три DLL в папку libs, используемую моим замороженным приложением.

Уловка, которую я должен был выполнить, включала дополнительную копию манифеста и msvcr90.dll в корне папки моего приложения рядом с генерируемым исполняемым файлом py2exe. Эта копия DLL используется для начальной загрузки приложения, но затем она выглядит только в папке libs.

Надеюсь, это открытие поможет кому-то еще.

Кроме того, у меня была та же проблема с тем, чтобы py2exe записывал реальное сообщение об ошибке. Затем я понял, что stderr не перенаправляется в мой лог-файл. Добавьте "> build.log 2>&1" в командной строке, где вы вызываете py2exe.

Просто для вашей информации, для меня это работало, чтобы скопировать файлы

Microsoft.VC90.CRT.manifest msvcr90.dll

в каталог с.exe на компьютере пользователя (у которого не установлен ни распространяемый пакет python или VC).

Спасибо за все подсказки здесь!

Выходные данные говорят, что вы используете WX. Попробуйте запустить py2exe с вашим сценарием, указанным как приложение с графическим интерфейсом вместо консоли. Если я не ошибаюсь, это может вызвать проблемы с py2exe.

Попробуйте это: http://www.py2exe.org/index.cgi/Tutorial

У меня сработало

На моем win8.1 я не нахожу пути

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

Наоборот, dll находится в

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

XXX может варьироваться в зависимости от вашего ПК

Вы можете искать в пути, а затем добавить путь в вашем файле setup.py

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

На wxPython wiki есть некоторая информация.

Развертывание приложения Python

py2exe с wxPython и Python 2.6

import sys

sys.path.append('c:/Program Files/Microsoft Visual Studio 9.0/VC/redist/x86/Microsoft.VC90.CRT')
Другие вопросы по тегам