如何使用Python和子进程运行可执行的.jar文件?

问题描述 投票:0回答:1

我之前一直在运行批处理文件。 (使用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的查询与批处理文件内容相同。

我不知道是什么问题。

你可以帮帮我吗?

python subprocess
1个回答
0
投票

假设您的后一个代码块是准确的复制/粘贴,最直接的问题似乎是一个错字。也就是说,%JAVA_HOME需要被%JAVA_HOME%解释为变量被shell调用。

但是,我会提出一些有希望的有用的建议。 \npause>nul实际上没有做任何事情(即使它确实如此,在python脚本本身处理等待用户输入似乎更有意义)。

当您调用subprocess.Popen并执行输出重定向到subprocess.PIPE时,您可能还想检索此输出并使用(out, err) = process.communicate()跟随该行。

最后但并非最不重要的是,不是连接和格式化字符串,而是依赖于shell将其解析回所需的参数,我建议考虑传递一个参数vector。即将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关键字参数。

© www.soinside.com 2019 - 2024. All rights reserved.