簡體   English   中英

如何使用Python的子進程和Popen執行帶有插值參數的Java命令

[英]How to execute a java command with interpolated arguments with Python's subprocess & Popen

嘗試使用子進程和Popen在Windows上的python中運行Java命令。

首先,我定義了兩個字符串:

java_string = 'java -Xmx1024M -classpath .;./db2jcc.jar;./RetainSdi.zip;./jviews-chart.jar;./jviews-framework.jar l2stats CRF1426 > ' + datetime.date.today().strftime("%d/%m/%Y") + '.html'

working_dir = "C:\\Users\\IBM_ADMIN\\Desktop\\Weekly Report 2014\\"

然后我嘗試使用子流程,如下所示:

subprocess.Open([java_string], cwd=working_dir)

結果為“ FileNotFoundError:[WinError 2]系統找不到指定的文件”

我編輯了很長的java_string使其沒有java命令,如下所示:

java_string = '-Xmx1024M -classpath .;./db2jcc.jar;./RetainSdi.zip;./jviews-chart.jar;./jviews-framework.jar l2stats CRF1426 > ' + datetime.date.today().strftime("%d/%m/%Y") + '.html'

然后像這樣調用Popen:

subprocess.Popen(['java', java_string], cwd=working_dir)

導致

無效的最大堆大小:-Xmx1024M -classpath。; ../ db2jcc.jar; ./ RetainSdi.z ip; ./ jviews-chart.jar; ./ jviews-framework.jar l2stats CRF1426> 21/04 / 2014.html錯誤: 無法創建Java虛擬機。

這至少是一個Java錯誤(因此它在%PATH%中找到了Java exec,但是與Java將整個字符串視為單個參數有關?我不知道。

此處的正確格式是什么? 任何幫助,不勝感激!

您可能需要將參數拆分為一個列表,如文檔中所述:

除非另有說明,否則建議將args作為序列傳遞。

所以代替:

subprocess.Popen(['java', '-Xmx1024M -classpath . com.foo.Bar']
# Error (Invalid maximum heap size)

采用:

subprocess.Popen(['java', '-Xmx1024M', '-classpath', '.', 'com.foo.Bar']
# OK

另請參閱Windows特定的用於轉換參數序列的規則

已更新 :如果您需要使用shell的功能,例如使用>重定向到文件,則需要包含shell=True參數,例如:

subprocess.Popen('echo foo > deleteme.txt', shell=True)

或按照JF Sebastian的注釋中所述指定stdout參數(為方便起見,在此復制):

subprocess.call(['echo', 'foo'], stdout=open('deleteme.txt', 'wb'))

文檔中的一個注釋:

如果與不受信任的輸入結合使用,則傳遞shell = True可能會帶來安全隱患。

暫無
暫無

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

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