我以前一直在运行批处理文件。 (使用Python)
批处理文件内容如下
@echo off
"%JAVA_HOME%\bin\java" -Dfile.encoding=utf-8 -Djava.file.encoding=UTF-8 -jar -Xms1024m -Xmx1024m C:\val\val.jar --basedir C:\val --filetype shp --cidx 5 --layerdefpath C:\val\임상도layer.json --valoptpath C:\val\임상도option.json --objfilepath C:\val\50000.zip --crs EPSG:5186
pause>nul
现在我要直接运行jar文件,而不是批处理文件。
但这是行不通的。
query = '"%JAVA_HOME/bin/java"' + ' -Dfile.encoding=utf-8 -Djava.file.encoding=UTF-8 -jar -Xms1024m -Xmx1024m C:/val/val.jar --basedir C:/val --filetype shp --cidx %s --layerdefpath %s --valoptpath %s --objfilepath %s --crs EPSG:5186 \npause>nul' % (cidx, self.dockwidget.path1.text(),self.dockwidget.path2.text(),self.dockwidget.path3.text())
process = subprocess.Popen(
query,
shell=True,
stdout=subprocess.PIPE
)
param的查询与批处理文件的内容相同。
我不知道是什么问题。
你能帮我吗?
答案 0 :(得分:0)
最直接的问题似乎是打字错误,假设您后面的代码块是准确的复制/粘贴。即,%JAVA_HOME
必须为%JAVA_HOME%
,才能被称为shell解释为变量。
但是,我会提出一些更有用的建议。 \npause>nul
实际上什么也没做(即使这样做了,处理等待python脚本本身中的用户输入似乎更有意义)。
当您拨打subprocess.Popen
并执行到subprocess.PIPE
的输出重定向时,您可能还希望检索此输出并在行的后面加上(out, err) = process.communicate()
。
最后但并非最不重要的一点是,我建议不要考虑传递参数向量,而是串联和格式化字符串并依靠外壳将其解析回所需的参数。即将query
定义为:
query = [os.path.join(os.environ["JAVA_HOME"], "bin/java"),
"-Dfile.encoding=utf-8", "-Djava.file.encoding=UTF-8",
"-jar", "-Xms1024m", "-Xmx1024m", "C:/val/val.jar",
"--basedir", "C:/val", "--filetype", "shp", "--cidx", cidx,
"--layerdefpath", self.dockwidget.path1.text(),
"--valoptpath", self.dockwidget.path2.text(),
"--objfilepath", self.dockwidget.path3.text(),
"--crs", "EPSG:5186"]
然后删除shell=True
关键字参数。