簡體   English   中英

如何使用Python和子進程運行可執行的.jar文件?

[英]How run executable .jar file with Python & subprocess?

我之前一直在運行批處理文件。 (使用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
)

參數的查詢與批處理文件的內容相同。

我不知道是什么問題。

你可以幫幫我嗎?

假設您后面的代碼塊是准確的復制/粘貼,最直接的問題似乎是拼寫錯誤。 即, %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關鍵字參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM