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

Python os.system без вывода

Я запускаю это:

os.system("/etc/init.d/apache2 restart")

Он перезапускает веб-сервер, как и должно быть, и, как и если бы я выполнил команду непосредственно с терминала, он выводит это:

* Restarting web server apache2 ... waiting [ OK ]

Однако я не хочу, чтобы он действительно выводил его в моем приложении. Как я могу отключить его? Спасибо!

4b9b3361

Ответ 1

Избегайте os.system() всеми средствами и вместо этого используйте подпроцесс:

with open(os.devnull, 'wb') as devnull:
    subprocess.check_call(['/etc/init.d/apache2', 'restart'], stdout=devnull, stderr=subprocess.STDOUT)

Это эквивалент subprocess /etc/init.d/apache2 restart &> /dev/null.

Существует subprocess.DEVNULL в Python 3.3+:

#!/usr/bin/env python3
from subprocess import DEVNULL, STDOUT, check_call

check_call(['/etc/init.d/apache2', 'restart'], stdout=DEVNULL, stderr=STDOUT)

Ответ 2

Вы должны использовать модуль subprocess, с помощью которого вы можете гибко управлять stdout и stderr. os.system устарел.

Модуль subprocess позволяет вам создать объект, представляющий исполняемый внешний процесс. Вы можете прочитать его из него stdout/stderr, написать ему stdin, отправить его сигналы, завершить его и т.д. Основной объект в модуле Popen. Существует множество других удобных методов, таких как вызов и т.д. docs являются очень полными и включают в себя раздел по замене более старые функции (включая os.system).

Ответ 3

В зависимости от вашей ОС (и почему, как сказал Нуфаль, вы должны использовать подпроцесс) вы можете попробовать что-то вроде

 os.system("/etc/init.d/apache restart > /dev/null")

или (чтобы отключить также ошибку)

os.system("/etc/init.d/apache restart > /dev/null 2>&1")

Ответ 4

Вот функция системного вызова, которую я собрал несколько лет назад и использовал в различных проектах. Если вы вообще не хотите выводить команду из команды, вы можете просто сказать out = syscmd(command), а затем ничего не сделать с помощью out.

Протестировано и работает в Python 2.7.12 и 3.5.2.

def syscmd(cmd, encoding=''):
    """
    Runs a command on the system, waits for the command to finish, and then
    returns the text output of the command. If the command produces no text
    output, the command return code will be returned instead.
    """
    p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT,
        close_fds=True)
    p.wait()
    output = p.stdout.read()
    if len(output) > 1:
        if encoding: return output.decode(encoding)
        else: return output
    return p.returncode