ImportError для модуля osgeo (embd. Py) при вызове переносимых двоичных файлов GDAL из Java после использования сценария bat для обновления env. переменные пути - PullRequest
0 голосов
/ 04 июля 2019

Редактировать 1: Забыл упомянуть, что я использую Python - это встроенный Python.


Я скачал двоичные файлы Windows GDAL из Внутренние компоненты ГИС . Предпосылка

Структура каталогов :

Parent
 |gnuplot
 |mysoft.exe
 |gdal
 |python-embedded
 |jvm
 |gsl2
 |mybinaries
 |mysoftlaunch.bat

Файл bat предоставляется двоичными файлами GDAL, и я внес соответствующие изменения в файл и каталог, в который я его поместил.

@echo off

set SDK_ROOT=%~dp0gdal\
set SDK_ROOT=%SDK_ROOT:\\=\%
set GNUPLOT_ROOT=%~dp0gnuplot\
set PYTHON_ROOT=%~dp0python-3.7.3-embed-amd64\
@echo %SDK_ROOT%
@echo %GNUPLOT_ROOT%

goto setenv
if "%1" == "setenv" goto setenv

%comspec% /k "%SDK_ROOT%SDKShell.bat" setenv %1
goto exit

:setenv
@echo Setting environment for using the GDAL and MapServer tools.

if "%2"=="hideoci" goto hideoci

set ocipath=0
set _path="%PATH:;=" "%"
for %%p in (%_path%) do if not "%%~p"=="" if exist %%~p\oci.dll set ocipath=1

if "%ocipath%"=="0" goto hideoci
@echo WARNING: If you encounter problems with missing oci libraries then type:
@echo   SDKShell hideoci
goto setenv2

...
...

:setenv2
@echo at set env 2
SET "PATH=%SDK_ROOT%bin;%SDK_ROOT%bin\gdal\python\osgeo;%SDK_ROOT%bin\proj6\apps;%SDK_ROOT%bin\gdal\apps;%SDK_ROOT%bin\ms\apps;%SDK_ROOT%bin\gdal\csharp;%SDK_ROOT%bin\ms\csharp;%SDK_ROOT%bin\curl;%GNUPLOT_ROOT%bin\;%SDK_ROOT%gsl2\bin\;%PATH%"
SET "GDAL_DATA=%SDK_ROOT%bin\gdal-data"
SET "GDAL_DRIVER_PATH=%SDK_ROOT%bin\gdal\plugins"
SET "PYTHONPATH=%SDK_ROOT%bin\gdal\python\osgeo;%SDK_ROOT%bin\gdal\python;%SDK_ROOT%bin\ms\python;%PYTHON_ROOT%"
SET "PROJ_LIB=%SDK_ROOT%bin\proj6\SHARE"
SET "LD_LIB_PATH=%SDK_ROOT%gsl2\lib"
@echo done setting variables
start "MYSOFT" cmd /c java -jar "%~dp0mysoft.exe%"
@echo started mysoftware
exit
:exit

Несколько вещей здесь:

  1. Я использовал launch4j для указания пути к jvm для моего jar-файла и сделал его exe-файлом, поэтому существует mysoft.exe
  2. Я указал относительные пути в своем программном обеспечении для доступа к требуемым исполняемым файлам или сценариям.
  3. Я использовал встроенный в python и дал относительный путь скрипта python, который я бы вызвал как gdal_merge.py.
  4. Я не хотел делать setx один раз в файле bat и запускать программное обеспечение напрямую, потому что, если пользователи изменят каталог программного обеспечения и снова запустят сценарий, ограничение размера пути в окнах будет исчерпано и будет катастрофа. (почему я запускаю программное обеспечение из файла bat).

Сценарий должен был установить переменные среды для всех запущенных дочерних процессов.

Я могу подтвердить, что gdal_translate работал нормально. [Я указал относительный путь к нему, а не вызывал его из среды.]

Рабочий процесс :

  1. Я устанавливаю переменные среды в bat-файле и запускаю java-программу.
  2. У меня есть Java-программа в качестве пользовательского интерфейса. Программа Java вызывает некоторый исполняемый файл или сценарий, который включает gdal_merge.py.
  3. Я указываю полный путь к gdal_merge.py в своем коде и вызываю его с помощью ProcessBuilder

Error

from osgeo import gdal
ModuleNotFoundError: No module named 'osgeo'.

Ожидаемое решение: После установки пути из файла bat (во встроенный python, jvm, gdal {все, что требуется, например, gdal_data, gdal_driver, путь для двоичных файлов и т. Д.}), Запустите программное обеспечение Java, которое наследует переменные среды, которые запускают файл gdal_merge.py.

В следующем порядке:

String path = System.getProperty("user.dir");
ProcessBuilder pb = new ProcessBuilder();
pb.inheritIO();
pb.command(Paths.get(path+"/python-embedded/python.exe").toString(),Paths.get(path+"/gdal/....../python/scripts/gdal_merge.py").toString(),...{other parameters required for gdal_merge.py}); 

PS:
Paths.get(x+"abc/def/").toString() - Я использую для преобразования путей в стиле * NIX в пути в стиле Windows.

1 Ответ

1 голос
/ 08 июля 2019

Согласно ошибкам Issue28245 Python , это преднамеренная функция.Встроенный питон полностью изолирован от вашей системной среды.

Чтобы указать путь, по которому этот встроенный питон ищет пакеты, вам нужно отредактировать файл pythonxx._pth.

Просто добавьте путь в каждой строке.Нет необходимости в переменных.Вы также можете добавить относительный путь.

Примеры файла ._pth:

pythonxx.zip # default value
. # default value
..\gdal\bin\gdal\python\
..\gdal\bin\gdal\python\osgeo\
..\gdal\bin\gdal\python\scripts\
..\gdal\bin\ms\python\

Это работает как шарм.

...