使用子进程只在python中的变量中获取stdout

时间:2015-05-15 14:28:26

标签: python subprocess

我在cli中使用以下命令,如下所示,

  [mbelagali@mbelagali-vm naggappan]$ aws ec2 create-vpc --cidr-block 172.35.0.0/24 --no-verify-ssl --endpoint-url https://10.34.172.145:8787

/usr/local/aws/lib/python2.6/site-packages/botocore/vendored/requests/packages/urllib3/connectionpool.py:769: 
InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.org/en/latest/security.html

"Vpc": {
    "InstanceTenancy": "default",
    "State": "pending",
    "VpcId": "vpc-ebb1608e",
    "CidrBlock": "172.35.0.0/24",
    "DhcpOptionsId": "dopt-a24e51c0"
}

现在我使用“2> / dev / null”重定向警告,以便我只获得json响应。

现在我需要使用python子进程实现它,因此尝试了以下选项,

cmd = "aws ec2 create-vpc --cidr-block " + cidr_block + " --no-verify-ssl --endpoint-url " + endpoint_url
cmd_arg = shlex.split(cmd.encode('utf-8'))
p1 = subprocess.Popen(
    cmd_arg,
    stdout=subprocess.PIPE,
    stderr=subprocess.STDOUT)
output, error = p1.communicate()

现在在输出变量中,我得到的是完整的输出,包括警告消息,如何在shell脚本中忽略警告消息

3 个答案:

答案 0 :(得分:2)

如果您不想要stderr消息,则不应该使用等同于stderr=subprocess.STDOUT的标记2>&1。如果你只是删除我怀疑你会得到你想要的。如果要将stderr重定向到/ dev / null,可以按照以下答案操作:How to hide output of subprocess in Python 2.7

答案 1 :(得分:0)

要分隔stderr和stdout,只需创建两个独立的管道。

p1 = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

完全忽略stderr只需打开devnull并在那里重定向stderr。

with open(os.devnull) as devnull:
    p1 = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=devnull)
  

os.devnull空设备的文件路径。例如:'/ dev / null'   适用于POSIX,适用于Windows的'nul'。也可以通过os.path。

获得

答案 2 :(得分:0)

获取子进程打印到stdout的json数据,同时忽略其stderr上的警告:

from subprocess import check_output

json_data = check_output(cmd, stderr=DEVNULL)

其中DEVNULL is defined here