PythonPopen变量的输入?
我正在尝试使用Popen运行一个java程序,该程序包含几个参数,最后一个参数是xml模板 到目前为止,我尝试通过communicate()传递模板的值,但它似乎不起作用PythonPopen变量的输入?,python,popen,Python,Popen,我正在尝试使用Popen运行一个java程序,该程序包含几个参数,最后一个参数是xml模板 到目前为止,我尝试通过communicate()传递模板的值,但它似乎不起作用 command = [ 'java', '-jar', '~/jenkins-cli.jar', '-noKeyAuth', '-s', 'docker-host', 'create-job', (s
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
java-jar~/jenkins-cli.jar-noKeyAuth-s jenkins主机创建作业测试dev
是否有更好的方法将template.render(template\u vars)的输出作为流程的输入发送?我认为您的问题不在于这里的输入,而在于参数。特别是:
'~/jenkins-cli.jar',
在命令行上,您可以免费获得shell平铺扩展。但是当使用子流程
(或从任何语言调用exec
-系列函数,就像子流程
那样)时,必须手动执行,如下所示:
os.path.expanduser('~/jenkins-cli.jar'),
p = Popen(command, …)
out, err = p.communicate(input=…)
print(p.returncode, out, err)
此外,您正在为-s
选项('docker-host'
而不是'jenkins-host'
)和项目名称('something-env'
而不是'test-dev'
)传递不同的值,因此命令行工作的事实并不能真正表明您的代码应该工作
另外,如果您试图调试代码,忽略stdout、stderr和返回代码似乎很愚蠢。打印出来,看看你得到了什么,像这样:
os.path.expanduser('~/jenkins-cli.jar'),
p = Popen(command, …)
out, err = p.communicate(input=…)
print(p.returncode, out, err)
或者,当然,首先不要捕获
stdout
和stderr
,因此它们只是打印到控制台。“最后一个是xml模板”似乎不是真的;XML模板似乎是Java程序的标准格式,而不是命令行参数。这对我来说是个麻烦,感谢我完全没有使用它。我说jenkins host vs docker host的问题是我的错别字,在实际代码中它指定了我要删除的jenkins master的url,第二次它打出来的时候,我把事情搞砸了,打了docker,因为我一直在用它。谢谢你的帮助。