Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在使用bat脚本更新env后,在从java调用GDAL的可移植二进制文件时为模块osgeo(embd.py)导入错误。路径变量_Java_Batch File_Environment Variables_Python Import_Gdal - Fatal编程技术网

在使用bat脚本更新env后,在从java调用GDAL的可移植二进制文件时为模块osgeo(embd.py)导入错误。路径变量

在使用bat脚本更新env后,在从java调用GDAL的可移植二进制文件时为模块osgeo(embd.py)导入错误。路径变量,java,batch-file,environment-variables,python-import,gdal,Java,Batch File,Environment Variables,Python Import,Gdal,编辑1:忘了提到python,我使用的是嵌入式python 我已从下载了windows GDAL二进制文件。 前提: 目录结构: 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\ @e

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

我已从下载了windows GDAL二进制文件。 前提:

目录结构:

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
这里有几件事:

我使用launch4j为jar文件提供jvm的路径,并将其设置为exe,这就是为什么会有mysoft.exe 我已在软件中指定了访问所需可执行文件或脚本的相对路径。 我使用了嵌入的python,并给出了python脚本的相对路径,我将像gdal_merge.py一样调用该脚本。 我不想在bat文件中执行一次setx并直接运行软件,因为如果用户更改软件目录并再次运行脚本,windows中的路径大小限制将耗尽,这将是一场灾难。为什么我要从bat文件启动软件。 脚本应该为所有启动的子进程设置环境变量

我可以确认gdal_翻译工作正常。[我指定了它的相对路径,但没有从环境中调用它。]

工作流程:

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

预期解决方案: 在设置从bat文件到嵌入式python、jvm、gdal{所有必需的,如gdal_数据、gdal_驱动程序、二进制文件路径等}的路径后,启动一个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}); 
附言: Paths.getx+abc/def/.toString-我正在使用它将*NIX样式的路径转换为Windows样式的路径。

根据,这是一个经过深思熟虑的特性。嵌入式python与您的系统环境完全隔离

要包含此嵌入式python查找包的路径,您需要编辑pythonxx.\u 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\
这很有魅力

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}); 
pythonxx.zip # default value
. # default value
..\gdal\bin\gdal\python\
..\gdal\bin\gdal\python\osgeo\
..\gdal\bin\gdal\python\scripts\
..\gdal\bin\ms\python\