在使用BAT脚本更新Env之后,在调用Java的GDAL的Portable Binaries时,模块Osgeo(Embd



编辑1:忘了提到python,我正在使用的是嵌入python。


我从GIS内部下载了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 %%~poci.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%bingdalpythonosgeo;%SDK_ROOT%binproj6apps;%SDK_ROOT%bingdalapps;%SDK_ROOT%binmsapps;%SDK_ROOT%bingdalcsharp;%SDK_ROOT%binmscsharp;%SDK_ROOT%bincurl;%GNUPLOT_ROOT%bin;%SDK_ROOT%gsl2bin;%PATH%"
SET "GDAL_DATA=%SDK_ROOT%bingdal-data"
SET "GDAL_DRIVER_PATH=%SDK_ROOT%bingdalplugins"
SET "PYTHONPATH=%SDK_ROOT%bingdalpythonosgeo;%SDK_ROOT%bingdalpython;%SDK_ROOT%binmspython;%PYTHON_ROOT%"
SET "PROJ_LIB=%SDK_ROOT%binproj6SHARE"
SET "LD_LIB_PATH=%SDK_ROOT%gsl2lib"
@echo done setting variables
start "MYSOFT" cmd /c java -jar "%~dp0mysoft.exe%"
@echo started mysoftware
exit
:exit

这里的几件事:

  1. 我已经使用laight4j为我的JAR文件提供了JVM的路径,并将其作为exe,这就是为什么有mysoft.exe
  2. 我已经指定了我的软件中的相对路径以访问所需的可执行文件或脚本。
  3. 我已经使用了python插入的,并给出了我像 gdal_merge.py一样调用python脚本的相对路径。
  4. 我不想在BAT文件中执行setx并直接运行软件,因为如果用户更改软件的目录并再次运行脚本,则Windows中的路径尺寸限制将耗尽,并且将是灾难。(为什么我从BAT文件启动软件。(

该脚本应该为启动的所有子过程设置环境变量。

我可以确认gdal_translate工作正常。[我确实指定了它的相对路径,不是从环境中调用它。]

工作流程

  1. 我在BAT文件中设置了环境变量并启动Java程序。
  2. 我有一个Java程序作为用户界面。Java程序调用一些可执行文件或脚本,其中包括gdal_merge.py
  3. 我在我的代码中指定了gdal_merge.py的完整路径,并使用ProcessBuilder
  4. 调用它

错误

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

解决方案预期:从蝙蝠文件设置路径后(到嵌入式python,jvm,gdal {aske of gdal_data,gdal_driver,binaries等路径}(,启动一个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样式路径。

根据问题28245 python错误,这是一个故意的功能。嵌入的Python完全与您的系统环境隔离。

要包括此嵌入式Python寻找软件包的路径,您需要编辑Pythonxx._pth文件。

只需在每行中添加一个路径即可。无需变量。您也可以添加相对路径。

._pth文件的示例:

pythonxx.zip # default value
. # default value
..gdalbingdalpython
..gdalbingdalpythonosgeo
..gdalbingdalpythonscripts
..gdalbinmspython

这就像魅力一样。

最新更新