在python子进程调用中抑制输出

Dav*_*542 36 python subprocess stdout

对于以下命令:

subprocess.call(shlex.split(
            """/usr/local/itms/bin/iTMSTransporter -m lookupMetadata 
              -apple_id %s -destination %s"""%(self.apple_id, self.destination))
Run Code Online (Sandbox Code Playgroud)

它将整个输出打印到终端窗口.我如何在这里抑制所有输出?我尝试过subprocess.call(shlex.split(<command> > /dev/null 2&1)),但它没有产生所需的结果.我怎么会这样做?

lar*_*sks 49

您可以使用stdout=stderr=参数来subprocess.call()指向stdoutstderr选择您选择的文件描述符.也许是这样的:

import os

devnull = open(os.devnull, 'w')
subprocess.call(shlex.split(
    '/usr/local/itms/bin/iTMSTransporter -m lookupMetadata '
    '-apple_id %s -destination %s' % (self,apple_id, self.destination)),
  stdout=devnull, stderr=devnull)
Run Code Online (Sandbox Code Playgroud)

使用subprocess.PIPE,如果你不从管道读取,可能会导致你的程序块,如果它产生大量的输出.

更新

正如@yanlend在评论中提到的,新的(3.x)版本的Python包括subprocess.DEVNULL以更方便和便携的方式解决这个问题.在这种情况下,代码看起来像:

subprocess.call(shlex.split(
    '/usr/local/itms/bin/iTMSTransporter -m lookupMetadata '
    '-apple_id %s -destination %s' % (self,apple_id, self.destination)),
  stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
Run Code Online (Sandbox Code Playgroud)

  • 你可以使用os.devnull (30认同)
  • 使用像这样的预定义常量意味着如果null设备不是`/ dev/null`,这将继续工作而无需修改代码.例如,我相信这会返回不同的东西,但在Windows下仍然有用. (8认同)
  • 嘿看我学到了什么. (3认同)
  • 您可以直接使用 subprocess.DEVNULL 来抑制输出,无需使用 os.devnull 并打开它。`subprocess.call(shlex.split( '/usr/local/itms/bin/iTMSTransporter -m LookupMetadata ' '-apple_id %s -destination %s' % (self,apple_id, self.destination)), stdout=subprocess. DEVNULL,stderr = subprocess.DEVNULL)`请参阅https://docs.python.org/3/library/subprocess.html#subprocess.DEVNULL (2认同)

Dav*_*542 5

对我有用2>/dev/null的是在命令末尾附加。