2014-09-24 1 views
0

Я пытаюсь заморозить скрипт Python, содержащий импорт из osgeo, но исполняемый файл не работает с ImportError: No module named '_gdal'.Ошибка импорта GDAL после замораживания скрипта Python 3

Я урезанная мой сценарий только одну строку:

import osgeo

При работе в Python (версия 3.3.3) все хорошо. Я пробовал замораживать cx_Freeze и py2exe. Оба сообщают, что отсутствует модуль: ? _gdal imported from osgeo (среди прочего), но успешно заморозить скрипт. Затем exe не работает с указанным ImportError.

Я попытался импортировать _gdal в python, и он работает. Я попробовал вручную, включая модуль osgeo, в параметрах замораживания, но все равно получаю ту же ошибку.

Существует аналогичный вопрос здесь: Importing GDAL with cx_Freeze, Python3.4 но, возможно, это не проблема cx_freeze, потому что это также происходит с py2exe (он имеет экспериментальную поддержку Python 3 сейчас).

Кто-нибудь знает, как это исправить?

+0

Тот же вопрос Я спросил последнего человека с этой проблемой: если вы выполните 'import _gdal', а затем' print (_gdal) 'в приглашении Python, что он вам показывает? –

+0

@ThomasK импортирует '_gdal', если я не импортирую' osgeo' в первую очередь. После того, как я это сделаю, 'print (_gdal)' prints: '' –

+0

О, swig is делая забавные вещи. Попробуйте перейти в 'C: \ Python33 \ lib \ site-packages \ osgeo \ __ init __. Py' и отредактировать строку 13 (ish) из' import _gdal' в 'from. import _gdal', а затем снова замерзать. Вот файл, поскольку я предлагаю вам его изменить: https://gist.github.com/takluyver/ac036f733c6f79342780 –

ответ

1

Я нашел исправление. Я отредактировал файл osgeo\__init__.py и изменил строку 13 следующим образом: import osgeo._gdal. Это работает, но только если модуль osgeo._gdal включен вручную при замораживании. @Thomas K Ваше решение делает то же самое, что я думаю.

Обратите внимание, что то же самое изменение должно быть применено как в osgeo.ogr (строка 18) и osgeo.osr (строка 18) модулей, если они необходимы (import osgeo._ogr и import osgeo._osr соответственно). Это означает, что они также должны быть включены вручную при замораживании. Теперь моя команда замораживания выглядит так: python cxfreeze.py module1.py --include-modules=osgeo._gdal,osgeo._ogr,osgeo._osr.

Спасибо @Thomas K за вашу помощь.

+0

Добро пожаловать. У меня есть проблема, открытая на SWIG об этом: https://github.com/swig/swig/issues/145 –