Подтвердить что ты не робот

Есть ли тихая версия subprocess.call?

Есть ли вариант subprocess.call, который может запускать команду без печати до стандартного выхода или способ блокировать ее стандартными сообщениями?

4b9b3361

Ответ 1

Да. Перенесите его stdout на /dev/null.

process = subprocess.call(["my", "command"], stdout=open(os.devnull, 'wb'))

Ответ 2

Заметьте, часто такая болтовня находится на stderr, так что вы тоже можете заставить ее замолчать. Вот мой пример:

import os
from subprocess import check_call

with open(os.devnull, 'w') as shutup:
    return_code = check_call(args, stdout=shutup, stderr=shutup)

Ответ 3

subprocess.call также принимают перенаправления stdin/stdout/stderr:

process = subprocess.call(["my", "command"], stdout=open(os.devnull, 'wb'))

Ответ 4

Это рецепт, который я использую много: вызываю subprocess и собираю вывод, и когда команде удается отменить вывод, но когда он терпит неудачу, напечатайте вывод.

import subprocess as sp
import sys

if "print" in __builtins__.__dict__:
    prn = __builtins__.__dict__["print"]
else:
    def prn(*args, **kwargs):
        """
        prn(value, ..., sep=' ', end='\\n', file=sys.stdout)
        Works just like the print function in Python 3.x but can be used in 2.x.

        Prints the values to a stream, or to sys.stdout by default.
        Optional keyword arguments:
        file: a file-like object (stream); defaults to the current sys.stdout.
        sep:  string inserted between values, default a space.
        end:  string appended after the last value, default a newline.
        """
        sep = kwargs.get("sep", ' ')
        end = kwargs.get("end", '\n')
        file = kwargs.get("file", sys.stdout)

        s = sep.join(str(x) for x in args) + end
        file.write(s)


def rc_run_cmd_basic(lst_cmd, verbose=False, silent=False):
    if silent and verbose:
        raise ValueError("cannot specify both verbose and silent as true")

    p = sp.Popen(lst_cmd, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE)
    tup_output = p.communicate()

    s_cmd = ' '.join(lst_cmd)
    if verbose:
        prn()
        prn("command: '%s'\n" % s_cmd)

        if 0 != p.returncode:
            prn()
            prn("Command failed with code %d:" % p.returncode)
        else:
            prn("Command succeeded!  code %d" % p.returncode)
    if verbose:
        prn("Output for: " + s_cmd)
        prn(tup_output[0])
        prn()
    if not silent and 0 != p.returncode:
        prn("Error output for: " + s_cmd)
        prn(tup_output[1])
        prn()

    return p.returncode

Ответ 5

Я использую subprocess.check_output в таких случаях и отбрасываю возвращаемое значение. Возможно, вы захотите добавить комментарий к своему коду, указав, почему вы используете check_output вместо check_call. check_output также приятнее, когда происходит сбой, и вы заинтересованы в выводе ошибки. Пример кода ниже. Выход отображается только в том случае, если вы раскомментируете линию печати. Если команда не выполняется, генерируется исключение.

import subprocess
ret = subprocess.check_output(["cat", "/tmp/1"])
#print ret