понедельник, 18 октября 2010 г.

Скрещиваем pywinauto и py2exe

А начиналось все с GUI-приложения
Как-то понадобилось мне в приложении делать автоматизированную работу с внешними программами, а конкретно с Adobe Reader. Задача в следующем. При выполнении поиска в Python-приложении (то есть, вводим текст в wxPython GUI) - открывать PDF-файл с помощью Adobe Reader, да не просто открывать, а так, чтобы в строке поиска уже было введено слово, по которому ищется информация, а сам PDF-документ был открыт на первом найденном результате. Ко всему прочему приложение распространяется под Windows-платформы, исполняемые файлы создаются с помощью py2exe.

Но потребовалась некоторая автоматизация действий пользователя
Для решения этой задачи был выбран pywinauto - замечательная библиотека для тестирования GUI-приложений. И хотя в данном случае никакого тестирования нет, с автоматизацией она тоже справляется на ура.

И тут в чудесный мир Python врывается exe-формат
Все отлично отрабатывает, если запускать python скрипт. Проблемы возникают в случае, когда запускается это же приложение собранное с помощью py2exe.

Спасибо py2exe за его чудесную функцию ведения лога. В логе можно увидеть примерно следующее:

Traceback (most recent call last):
File "autorun.py", line 3, in
from gui.wxmain import SplashWindow
File "zipextimporter.pyc", line 82, in load_module
File "gui\wxmain.pyc", line 11, in
Splash window
File "zipextimporter.pyc", line 82, in load_module
File "pywinauto\__init__.pyc", line 28, in
File "zipextimporter.pyc", line 82, in load_module
File "pywinauto\findwindows.pyc", line 37, in
File "zipextimporter.pyc", line 82, in load_module
File "pywinauto\controls\__init__.pyc", line 33, in
File "zipextimporter.pyc", line 82, in load_module
File "pywinauto\controls\win32_controls.pyc", line 37, in
File "zipextimporter.pyc", line 82, in load_module
File "pywinauto\tests\__init__.pyc", line 153, in
File "pywinauto\tests\__init__.pyc", line 137, in __init_tests
ImportError: No module named allcontrols

Решаем проблему
Как видим, существует проблема с импортами в тестах. Проблема решается очень просто. Заходим в c:\Python<версия>\Lib\site-packages\pywinauto\tests\, открываем замечательный файлик __init__.py и комментируем все строки, которые хоть каким-то боком что-то импортируем (с целью экономии глаз и нервов читателя, полный код модуля приводить не буду). Собираем еще раз исполняемый exe-файл, и все работает.

P.S
Проблема у меня возникла в pywinauto при версии Python 2.6. Возможно, в других версиях такой проблемы и не будет.

1 комментарий:

  1. В новой версии pywinauto 0.5.0 этой проблемы больше нет.
    Проект переехал на GitHub: http://pywinauto.github.io/

    ОтветитьУдалить

В этом гаджете обнаружена ошибка