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 я понятия не имею, что именно.


person Charles Anderson    schedule 27.11.2008    source источник
comment
Если на самом деле больше нет вывода из py2exe, это действительно странно. Обычно он расскажет, почему это не удается. Лучшее, что я могу сказать, это прочитали ли вы все это: py2exe.org/index.cgi/Py2exeAndwxPython < / а>   -  person Ali Afshar    schedule 27.11.2008
comment
Чарльз: Я регулярно проверяю это, я заинтригован решением. Если вы это поняли, пожалуйста, отправьте ответ. Спасибо.   -  person Ali Afshar    schedule 28.11.2008


Ответы (11)


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

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

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

person Community    schedule 21.04.2009
comment
+1: Этот ответ действительно является единственно правильным для исходного вопроса, в котором сообщалось о проблеме во время сборки с помощью py2exe. Совершенно верно (как отмечено в собственном ответе Чарльза), что вам все еще нужно, чтобы DLL находилась на целевой машине, но при условии, что вы справились с этим, и вы все еще получаете эту ошибку на машине сборки (как я только что сделал) Ответ Билла выше красиво закрывает py2exe и позволяет вашей сборке завершиться. - person Peter Hansen; 28.06.2010
comment
Некоторое время это вызывало у меня проблемы, просто попробовал это исправление, и оно сработало на 100%. - person rectangletangle; 02.02.2011

Я обнаружил, что 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 / DLL, и теперь py2exe работает нормально.

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

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

person Charles Anderson    schedule 28.11.2008
comment
У меня была такая же проблема, и я применил ваше решение, и оно отлично сработало. Спасибо, что поделился! - person ; 08.12.2008
comment
У меня была такая же проблема с приложением PyQt4. Скачивание DLL помогло, спасибо! - person kender; 29.03.2009
comment
Отлично, но что вызывает эту зависимость? - person phkahler; 16.02.2010
comment
MSVCP90.dll также можно найти в официальный пакет Microsoft (x86). может также потребоваться развернуть этот пакет на всех машинах, на которых запущено это приложение! - person exhuma; 03.11.2010
comment
Возможно ли, что это просто требование для wxWidgets? В конце концов, wxWidgets использует собственный API платформы для максимальной интеграции. Я видел похожие жалобы в других местах, но в этих случаях люди использовали C ++ в Windows вместо Python и хотели работать с wxWidgets. - person rbaleksandar; 12.02.2015
comment
@SridharRatnakumar: не только нежелательно загружать случайные библиотеки DLL с этого сайта, но и включение их в свой пакет, вероятно, нарушает лицензию. Если у вас есть Visual Studio, есть файл redist.txt, в котором указано, какой файл вы можете распространять как часть вашей установки, если вам это действительно нужно. В противном случае просто используйте единственный надежный и одобренный метод: связать vcredist_x86.exe с вашей установкой. Бонусные баллы, если ваш установщик может запускать его в фоновом режиме. Да, это увеличивает размер вашей посылки. Но, по крайней мере, мы ПРЕКРАЩАЕМ советовать людям загружать такие библиотеки DLL. - person ; 25.04.2016
comment
@CharlesAnderson: то же замечание, не устанавливайте (или, что еще хуже, не распространяйте) DLL, которую вы нашли в сети. Но, по крайней мере, вы правильно поняли последнее предложение. - person ; 25.04.2016

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/

person Mike Driscoll    schedule 18.11.2010

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

person resplin    schedule 15.10.2009
comment
Как описано в этой теме: stackoverflow.com/questions/1570542, мое решение оказалось не таким умным, как я думал; это приводит к другим ошибкам. Мне просто нужно установить vcredist. Arg - person resplin; 16.10.2009
comment
Я говорю, что вы еще умны. Возможно, это не работает с приложением, использующим SQLite, но я попробовал трюк, добавив 3 библиотеки DLL и файл манифеста в каталог времени выполнения. Это позволило моему довольно простому приложению Python26 / py2exe работать правильно без ошибок и без необходимости устанавливать vc_redist на машине (Win2003 Server), чего я никак не мог сделать на клиентской машине. Более подробную информацию об этом простом решении у Вернера Ф. Брюхина можно найти здесь: sourceforge.net/mailarchive/ - person William Knight; 25.02.2010

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.

person Egor    schedule 25.09.2012

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

Microsoft.VC90.CRT.manifest msvcr90.dll

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

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

person george    schedule 13.04.2010
comment
Я просто хотел сказать, что имя Microsoft.VC90.CRT.manifest имеет решающее значение. Мой манифест был назван x86_Microsoft.VC90.CRT_1fc8b3b9 ..._ 9.0.21022.8_x-ww_d08 ..... manifest, и это вызвало у меня головную боль, задаваясь вопросом, почему он не работает. Спасибо! - person alex_jordan; 21.05.2013

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

person Community    schedule 28.11.2008
comment
Хорошо, мой файл setup.py теперь выглядит так: from distutils.core import setup import py2exe setup (windows = [{script: 'ServerManager.py'}]), но это не повлияло. Однако мне удалось доказать, что проблема связана с wxPython. Если я не импортирую wx, py2exe работает отлично. - person Charles Anderson; 28.11.2008
comment
Скачивание MSVCR90.DLL и копирование его в Python26 / DLL сработало для меня! - person Alex; 12.08.2009


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

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

py2exe с wxPython и Python 2.6

person Werner    schedule 12.02.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')
person petitchamp    schedule 21.02.2015

person    schedule
comment
Не могли бы вы объяснить OP, что делает этот код? (отредактируйте свой пост). Спасибо - person Paco; 10.02.2015