尝试在Windows上的python中运行java命令,使用subprocess& POPEN。
首先我定义了两个字符串:
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)
导致a “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一起看整个字符串作为单个参数?我不知道。
这里的格式是什么?任何帮助非常感谢!
答案 0 :(得分:3)
您可能需要将参数拆分为列表,如documentation:
中所述除非另有说明,否则建议将args作为a 序列
所以而不是:
subprocess.Popen(['java', '-Xmx1024M -classpath . com.foo.Bar']
# Error (Invalid maximum heap size)
使用:
subprocess.Popen(['java', '-Xmx1024M', '-classpath', '.', 'com.foo.Bar']
# OK
另请参阅特定于Windows的rules for converting an argument sequence。
已更新:如果您需要使用shell的功能,例如使用>
重定向到文件,则需要包含shell=True
参数,例如:
subprocess.Popen('echo foo > deleteme.txt', shell=True)
或者指定一个stdout
参数,如J. F. Sebastian的评论中所述(为方便起见,在此处复制):
subprocess.call(['echo', 'foo'], stdout=open('deleteme.txt', 'wb'))
文档中的一条注释:
如果与不信任相结合,传递shell = True可能会造成安全隐患 输入