来自Popen的输出的python问题stdout = Pipe

时间:2015-11-11 14:47:39

标签: python python-2.7 openssl pipe popen

我是python的新手,对不起,如果我遗漏了一些“显而易见的”。

目前我正在编写一个脚本来为DNSSEC生成TLSA记录。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from subprocess import Popen, PIPE


def makeTLSA():
    der_cert_proc = Popen(['openssl', 'x509','-in','/etc/letsencrypt/live/example.com/cert.pem','-outform','DER'], stdout=PIPE, stderr=PIPE)
    der_cert_output = der_cert_proc.communicate()[0].strip()

    return der_cert_output

print makeTLSA()

目前只打印出DER格式的证书。但输出与调用

不同

openssl x509 -in /etc/letsencrypt/live/example.com/cert.pem -outform DER

但如果我将其改为

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from subprocess import Popen, PIPE


def makeTLSA():
    der_cert_proc = Popen(['openssl', 'x509','-in','/etc/letsencrypt/live/example.com/cert.pem'], stdout=PIPE, stderr=PIPE)
    der_cert_output = der_cert_proc.communicate()[0].strip()

    return der_cert_output

print makeTLSA()

输出与

相同

openssl x509 -in /etc/letsencrypt/live/example.com/cert.pem

Python在Centos 7上是2.7.5。

1 个答案:

答案 0 :(得分:-1)

根据https://docs.python.org/2/library/subprocess.html#popen-objects

communicate()返回带有stdout和stderr的tuble,也许该命令将部分响应写入stderr。

您可以使用

进行检查
der_cert_output = (der_cert_proc.communicate()[0].strip() + 
                   der_cert_proc.communicate()[1].strip())

或者通过在命令行上删除stderr: openssl .... 2>的/ dev / null的