【问题标题】:Suppressing output in python subprocess call [duplicate]抑制python子进程调用中的输出[重复]
【发布时间】:2023-03-18 03:08:01
【问题描述】:

对于以下命令:

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

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

【问题讨论】:

    标签: python subprocess stdout


    【解决方案1】:

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

    【讨论】:

    • 对于未来的读者:这种方法不能保证适用于所有平台/shell,即使它可能适用于任何最近和 POSIX-y 的东西。
    • (另外,这仅适用于shell=True,您希望尽可能避免)
    • @larsks 为什么我要避免使用shell=true?这个解决方案非常简单,适用于我的情况。
    • @month 见the docs for details。除了那里提到的安全问题之外,如果您的命令字符串包含任何 shell 元字符,您还可能会出现意外行为,并且您还可能遇到烦人的引用问题。
    • @larsks 谢谢!就我而言,通过 shell 注入没有漏洞,因为我的命令字符串不是构造的而是硬编码的(它实际上只是启动了一个必要的 docker)。但我现在绝对意识到风险。
    【解决方案2】:

    您可以使用subprocess.call()stdout=stderr= 参数将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)
    

    使用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)
    

    【讨论】:

    • 你可以使用 os.devnull
    • 嘿,我学到了一些东西。
    • 使用这样的预定义常量意味着如果空设备不是/dev/null,这将继续工作而无需修改您的代码。例如,我相信这会返回一些不同但在 Windows 下仍然有用的东西。
    • subprocess.run 而不是subprocess.call 的解决方法是什么?在这种情况下,它不会抑制输出
    • 可以直接使用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)docs.python.org/3/library/subprocess.html#subprocess.DEVNULL
    猜你喜欢
    • 2021-05-08
    • 2018-10-04
    • 2016-11-01
    • 2016-08-17
    • 2019-03-23
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    相关资源
    最近更新 更多