PyInstaller + Wand (ImageMagick) — отсутствующие зависимости

Я провел последние пару дней, пытаясь понять, как создать приложение без зависимостей из набора сценариев Python3.4, которые у меня есть. К ним относится импорт wand, который требует установки ImageMagick на машину.
Пока все хорошо, приложение, запускаемое из исходного кода, отлично работает в обеих моих средах разработки (Debian8/Win10), находя все необходимые зависимости для Модуль жезла для правильной работы.

Проблемы возникают, когда я пытаюсь упаковать приложение с помощью PyInstaller.
Процесс сборки работает, как и ожидалось, извлекает ресурсы ImageMagick (.dlls и т. д.) и включает их в выходной каталог вместе с другими двоичными файлами, но когда я запускаю приложение на компьютерах без установленной библиотеки IM импорт невозможен.

Итак, я начал копаться в исходном коде Wand и понял, что зависимости ищутся в глобальных системных путях (например, C:\ProgramFiles). В качестве обходного пути в своем коде я просто переопределил переменную os.environ['MAGICK_HOME'] с помощью './', указав модулю получить зависимости на месте. И это работало, до определенного момента.

Теперь я могу запустить приложение: импорт не завис, графический интерфейс нарисован, функциональность не пострадала. По крайней мере, пока я не активирую какое-либо действие с использованием жезла, потому что всякий раз, когда я это делаю, приложение вылетает, вызывая следующее исключение:

wand.exceptions.ConfigureError: RegistryKeyLookupFailed `CoderModulesPath' @ error/module.c/GetMagickModulePath/666

Кажется очевидным, что отсутствие надлежащей общесистемной установки приводит к неработающим вызовам реестра (теперь тестируется на win), но, к сожалению, я не совсем знаком с CTypes (или чем-то еще, что используется для привязки к библиотеке ImageMagick), и я Я не уверен, как правильно создать приложение без отложений.

Как всегда, первый вопрос, который приходит на ум: я упускаю здесь что-то очевидное?
Если нет, что бы вы посоветовали?
Спасибо.


person nxet    schedule 02.02.2017    source источник


Ответы (1)


Это скорее комментарий, а не ответ, но я бы предложил следующее...

MAGICK_HOME

Целесообразно установить переменную среды MAGICK_HOME. Но я бы предложил использовать os.path для разрешения абсолютного пути системы; в отличие от родственника.

os.environ['MAGICK_HOME'] = os.path.abspath('.')

Очень незначительно, но помогает.

.dll и т. д.

Помните, что IM — это собственная экосистема. Это правда, что для работы wand нужны только библиотеки MagickWand и MagickCore, но для работы IM нужны все делегаты/кодировщики. Убедитесь, что все присутствует, и дважды проверьте QuickStart.txt.

В вашей системе сборки, возможно, стоит проверить утилиту identify, чтобы увидеть другие пути, которые должны быть включены на этапе сборки PyInstallers.

identify -list Configure | grep PATH

На моем Mac я получаю следующее...

CODER_PATH     /usr/local/lib/ImageMagick-6.9.5/modules-Q16/coders
CONFIGURE_PATH /usr/local/etc/ImageMagick-6/
DOCUMENTATION_PATH /usr/local/share/doc/ImageMagick-6
EXECUTABLE_PATH /usr/local/bin
FILTER_PATH    /usr/local/lib/ImageMagick-6.9.5/modules-Q16/filters
INCLUDE_PATH   /usr/local/include/ImageMagick-6
LIBRARY_PATH   /usr/local/lib/ImageMagick-6.9.5
SHARE_PATH     /usr/local/share/ImageMagick-6
SHAREARCH_PATH /usr/local/lib/ImageMagick-6.9.5/config-Q16

Файл policy.xml под CONFIGURE_PATH было бы идеально включить, чтобы обеспечить защиту вашего приложения от ImageTragick.

person emcconville    schedule 02.02.2017
comment
благодарю вас. чрезвычайно интересное понимание всего пакета IM, которое вызвало дополнительные исследования с моей стороны. к сожалению, я до сих пор не совсем понял, как правильно выполнять импорт, до такой степени, что даже последняя попытка не сработала: я жестко запрограммировал некоторые клавиши winreg, которые будут установлены, когда IM не будет найден на машине, а затем включил весь каталог установки IM в сборку, но все равно зависимости не удовлетворены. - person nxet; 03.02.2017