Skip to Content

PyWin32 + Py2Exe = ImportError?

Опубликовано в

Если вы уже пытались собирать какие-либо Python скрипты, использующие PyWin32, в один единственный .exe файл при помощи Py2Exe, то, вероятно, вы сталкивались с тем, что при запуске ваше приложение выбрасывает вот такое исключение:

ImportError: MemoryLoadLibrary failed loading win32api.pyd

Возможно, в поисках решения этой проблемы вы даже набрели на соответствующий баг в багтрекере Py2Exe. Но разработчики хранят молчание, и решения проблемы там нет.

На самом деле, побороть эту неприятность можно, причем не особо напрягаясь. Более того, побороть ее можно двумя способами.

Способ первый. Популярный

Отказаться от мысли собирать скрипты в один exe файл, и, соответственно, использовать опцию "bundle_files": 3 вместо "bundle_files": 1. При этом сборка будет замечательно работать, но ее вид оставляет желать лучшего, ибо при одном только взгляде на количество файлов в ней, начинаешь задумываться, что лучше уж попросить конечного пользователя поставить Python. 

Способ второй. Правильный

Все же попытаться собрать приложение в один единственный файл, но при этом исключить из сборки библиотеки mswsock.dll, powrprof.dll, поскольку они уже присутствуют в Windows, и именно при обращении к ним возникает упомянутая выше ошибка. Это можно сделать добавив в словарь конфигурации Py2Exe опцию "dll_excludes", т.е. setup.py должен выглядеть приблизительно так:

  1. ...
  2. setup( options = {
  3.                   "py2exe":
  4.                             {
  5.                              "compressed": 1,
  6.                              "optimize": 2,
  7.                              "bundle_files": 1,
  8.                              "dll_excludes": [ "mswsock.dll", "powrprof.dll" ]
  9.                              }
  10.                  },
  11.  
  12. zipfile = None,
  13. ...

После этого ваше приложение должно запуститься без всяких проблем.

----------

Статьия отличная, пишите ещё

Статьия отличная, пишите ещё и побольше!

Отправить комментарий

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.
  • Pairs of<blockquote> tags will be styled as a block that indicates a quotation.
  • Textual smileys will be replaced with graphical ones.

Подробнее о форматировании