py2exe не может создать исполняемый файл - PullRequest
51 голосов
/ 27 ноября 2008

Я использую 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 ]

41 голосов
/ 22 апреля 2009

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

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

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

40 голосов
/ 28 ноября 2008

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

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

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

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

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

9 голосов
/ 18 ноября 2010

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#Step52

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

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

6 голосов
/ 25 сентября 2012
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.

6 голосов
/ 15 октября 2009

Похоже, что это только зависимость для 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.

3 голосов
/ 13 апреля 2010

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

Microsoft.VC90.CRT.manifest msvcr90.dll

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

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

1 голос
/ 10 августа 2012

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

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

1 голос
/ 28 ноября 2008

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

0 голосов
/ 22 февраля 2015

На моем 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')
0 голосов
/ 12 февраля 2015

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

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

py2exe с wxPython и Python 2.6

...