Я провел последние пару дней, пытаясь понять, как создать приложение без зависимостей из набора сценариев Python3.4, которые у меня есть. К ним относится импорт wand
, который требует установки ImageMagick
на машину.
Пока все хорошо, приложение, запускаемое из исходного кода, отлично работает в обеих моих средах разработки (Debian8/Win10), находя все необходимые зависимости для Модуль жезла для правильной работы.
Проблемы возникают, когда я пытаюсь упаковать приложение с помощью PyInstaller.
Процесс сборки работает, как и ожидалось, извлекает ресурсы ImageMagick (.dll
s и т. д.) и включает их в выходной каталог вместе с другими двоичными файлами, но когда я запускаю приложение на компьютерах без установленной библиотеки IM импорт невозможен.
Итак, я начал копаться в исходном коде Wand и понял, что зависимости ищутся в глобальных системных путях (например, C:\ProgramFiles). В качестве обходного пути в своем коде я просто переопределил переменную os.environ['MAGICK_HOME']
с помощью './'
, указав модулю получить зависимости на месте. И это работало, до определенного момента.
Теперь я могу запустить приложение: импорт не завис, графический интерфейс нарисован, функциональность не пострадала. По крайней мере, пока я не активирую какое-либо действие с использованием жезла, потому что всякий раз, когда я это делаю, приложение вылетает, вызывая следующее исключение:
wand.exceptions.ConfigureError: RegistryKeyLookupFailed `CoderModulesPath' @ error/module.c/GetMagickModulePath/666
Кажется очевидным, что отсутствие надлежащей общесистемной установки приводит к неработающим вызовам реестра (теперь тестируется на win), но, к сожалению, я не совсем знаком с CTypes (или чем-то еще, что используется для привязки к библиотеке ImageMagick), и я Я не уверен, как правильно создать приложение без отложений.
Как всегда, первый вопрос, который приходит на ум: я упускаю здесь что-то очевидное?
Если нет, что бы вы посоветовали?
Спасибо.