Импорт GDAL с помощью cx_Freeze, Python3.4

Я пытаюсь создать исполняемый файл для некоторого кода на Python3.4 для распространения в Windows. Эта программа требует GDAL для некоторых функций отображения, но она появляется в отсутствующих модулях во время сборки cx_Freeze:

Missing modules:
? _gdal imported from osgeo, osgeo.gdal
? _gdal_array imported from osgeo.gdal_array
? _gdalconst imported from osgeo.gdalconst
? _ogr imported from osgeo.ogr
? _osr imported from osgeo.osr

Cx_Freeze.exe все еще собирается, но когда я пытаюсь запустить его, я, естественно, получаю:

ImportError: No module named '_gdal'

Ниже мой сценарий установки:

import sys  
from cx_Freeze import setup, Executable 

application_title = "Parametric_Price" #what you want to application to be called
main_python_file = "ParamMain.py" #the name of the python file you use to run the program

base = None
if sys.platform == "win32":
    base = "Win32GUI"

includes = ["atexit","re","osgeo.ogr"]
packages = ["osgeo"]
# includeFiles = 

build_exe_options = {"packages": packages, "includes": includes}

setup(
        name = application_title,
        version = "0.1",
        description = "Parametric pricing tool using historical earthquake, hurricane datasets",
        options = {"build_exe" : build_exe_options },
        executables = [Executable(main_python_file, base = base)])

Я пробовал различные способы включения модуля вручную, используя include в параметрах build_exe в установочном файле cx_Freeze, но безрезультатно, а использование Python3 действительно ограничивает мои возможности для альтернативных исполняемых инструментов распространения. Кто-нибудь понял, как разрешить этот импорт?


person khe    schedule 28.07.2014    source источник
comment
Если вы выполните import _gdal, а затем print _gdal в оболочке Python, что вы увидите?   -  person Thomas K    schedule 28.07.2014
comment
@ThomasK Он импортируется без ошибок, и я могу получить доступ к его функциям. В самой программе я его косвенно импортирую через osgeo.ogr, osgeo.osr, и там он тоже корректно работает. Я считаю, что проблема связана с моей настройкой cx_Freeze.   -  person khe    schedule 29.07.2014
comment
Я понимаю. Но print _gdal должен показать вам, откуда он загружается, что может подсказать, почему cx_Freeze его не находит.   -  person Thomas K    schedule 29.07.2014


Ответы (1)


У меня те же проблемы, похоже, это проблема, связанная с SWIG. Мой обходной путь состоял в том, чтобы получить из Traceback все файлы osgeo, которые вызывают исключение, и вручную изменить код (например, C:\Python34\Lib\site-packages\osgeo__init__.py) со следующим фрагментом:

 except ImportError:
    import _gdal
    return _gdal

to:

 except ImportError:
    from osgeo import _gdal # MANUAL PATCH: added 'from osgeo'
    return _gdal

Надеюсь, поможет!

person gmas80    schedule 23.10.2014