2014-12-02 79 views
0

我想用Popen来运行一个需要几个参数的java程序,最后一个是xml模板。来自变量的Python Popen输入?

我到目前为止试图通过沟通()传递模板的价值,但似乎并不奏效。

command = [ 
     'java', 
     '-jar', 
     '~/jenkins-cli.jar', 
     '-noKeyAuth', 
     '-s', 
     'docker-host', 
     'create-job', 
     (self.project.project_name+'-'+env) 
    ] 

subprocess.Popen(command, 
       stdin=subprocess.PIPE, 
       stdout=subprocess.PIPE, 
       stderr=subprocess.PIPE 
       ).communicate(input=template.render(template_vars)) 

我知道一个事实,即template.render(template_vars)的值是正确的,我可以使用从该函数调用的输出在命令行上和它完美的作品,这个问题只在传递对过程的价值。

如果我从命令行运行以下所有功能。

java -jar ~/jenkins-cli.jar -noKeyAuth -s jenkins-host create-job test-dev < template.xml 

有没有更好的方法将template.render(template_vars)的输出作为输入发送到进程?

+0

“最后一个是xml模板”似乎不是真的;看起来XML模板是Java程序的stdin,而不是命令行参数。 – abarnert 2014-12-02 22:46:37

回答

2

我不认为你的问题是这里的输入,而是参数。特别是:

'~/jenkins-cli.jar', 

在命令行上,您可以免费获得shell波浪扩展。但使用subprocess(或调用exec - 家庭功能的任何语言,为subprocess那样)时,你必须做手工,像这样:

os.path.expanduser('~/jenkins-cli.jar'), 

此外,你传递一个不同的价值,为-s选项('docker-host'而不是'jenkins-host')以及项目名称('something-env'而不是'test-dev'),因此命令行工作并不能真正表明您的代码应该正常工作。作为一个方面说明,如果你试图调试你的代码,忽略stdout,stderr和return代码似乎很愚蠢。打印出来,看看你会得到什么,就像这样:

p = Popen(command, …) 
out, err = p.communicate(input=…) 
print(p.returncode, out, err) 

或者,当然,不捕获在首位的stdoutstderr,所以他们只是打印到控制台。

+0

这是〜为我搞砸的东西,谢谢我完全错过了我的使用it.The问题与我说jenkins主机与码头主机是我的一个错字,在实际的代码中它指定我的网址jenkins大师,我正在删除,第二次它键入它,我只是搞砸了,键入码头,因为我一直在使用它。谢谢您的帮助。 – 2014-12-03 14:37:09