PythonPopen变量的输入?

PythonPopen变量的输入?,python,popen,Python,Popen,我正在尝试使用Popen运行一个java程序,该程序包含几个参数,最后一个参数是xml模板 到目前为止,我尝试通过communicate()传递模板的值,但它似乎不起作用 command = [ 'java', '-jar', '~/jenkins-cli.jar', '-noKeyAuth', '-s', 'docker-host', 'create-job', (s

我正在尝试使用Popen运行一个java程序,该程序包含几个参数,最后一个参数是xml模板

到目前为止,我尝试通过communicate()传递模板的值,但它似乎不起作用

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,因为我一直在用它。谢谢你的帮助。