我正在尝试使用Popen运行一个带有一些参数的java程序,最后一个是xml模板。
到目前为止我尝试通过communication()传递模板的值,但它似乎不起作用。
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 :(得分: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和返回代码似乎非常愚蠢。打印出来,看看你得到了什么,如下:
p = Popen(command, …)
out, err = p.communicate(input=…)
print(p.returncode, out, err)
或者,当然,首先不要捕获stdout
和stderr
,因此只需打印到控制台即可。