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 есть некоторая информация.
import sys
sys.path.append('c:/Program Files/Microsoft Visual Studio 9.0/VC/redist/x86/Microsoft.VC90.CRT')