Python Popen从变量输入?

时间:2014-12-02 22:33:10

标签: python popen

我正在尝试使用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)的输出作为输入发送给流程?

1 个答案:

答案 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)

或者,当然,首先不要捕获stdoutstderr,因此只需打印到控制台即可。