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

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

18 голосов
/ 08 апреля 2011

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

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

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

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

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

Ответы [ 4 ]

33 голосов
/ 08 апреля 2011

Избегайте 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.

На Python есть subprocess.DEVNULL + + 1011 *:

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

check_call(['/etc/init.d/apache2', 'restart'], stdout=DEVNULL, stderr=STDOUT)
21 голосов
/ 08 апреля 2011

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

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

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

os.system("/etc/init.d/apache restart > /dev/null 2>&1")
21 голосов
/ 08 апреля 2011

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

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

0 голосов
/ 14 сентября 2017

Вот функция системного вызова, которую я собрал несколько лет назад и использовал в различных проектах.Если вам вообще не нужен вывод команды, вы можете просто сказать 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's 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
...