[英]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.