如何使用Python的子进程和放大器执行带有插值参数的java命令POPEN

时间:2014-04-21 23:10:52

标签: python formatting arguments subprocess

尝试在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一起看整个字符串作为单个参数?我不知道。

这里的格式是什么?任何帮助非常感谢!

1 个答案:

答案 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可能会造成安全隐患   输入