Обычно я могу изменить stdout в Python, изменив значение sys.stdout
. Однако это только, кажется, влияет на заявления print
. Итак, есть ли способ подавить вывод (на консоль) программы, запускаемой с помощью команды os.system()
в Python?Перенаправление stdio из команды в os.system() в Python
ответ
Возможно, вы запустите программу через subprocess.Popen
, с сообщением subprocess.PIPE
, а затем запустите этот вывод, когда захотите, но как есть, os.system
просто запускает команду, и ничего больше.
from subprocess import Popen, PIPE
p = Popen(['command', 'and', 'args'], stdout=PIPE, stderr=PIPE, stdin=PIPE)
output = p.stdout.read()
p.stdin.write(input)
Гораздо более гибкий, на мой взгляд. Вы можете посмотреть на полную документации: Python Subprocess module
Перенаправление stderr, а также стандартный вывод.
Это не делает работу цитаты из http://docs.python.org/library/os.html#process-management os.system (команды) Выполнение команды (строки) в подоболочке. Это реализуется путем вызова стандартной системы функций C() и имеет те же ограничения. Изменения в sys.stdin и т. Д. Не отражаются в среде выполненной команды. –
В системе unix вы можете перенаправить stderr и stdout в/dev/null как часть самой команды.
os.system(cmd + "> /dev/null 2>&1")
Это работает только в системе unix –
Да, правильно. Ответ обновляется, чтобы избежать путаницы. – ealdent
Если вы хотите, чтобы полностью устранить консоль, которая запускает с программой питона, вы можете сохранить его с расширением .pyw.
Возможно, я не понимаю вопроса.
Ммм ... ладно. Так что команда выполняется на линии P = Popen (...), да? И он будет показывать только вывод при вызове p.stdout.read() ... да? Спасибо –
Хорошо ... команды выполнялись, но в отдельном потоке. В любом случае я могу либо запустить программу во время выполнения команд, либо сохранить ее в одном потоке? Спасибо. –
Просто используйте p.wait(). Однако, по-видимому, это может привести к взаимоблокировке при использовании PUDE stdout, если программа генерирует достаточный выход. См. Полную документацию по адресу http://docs.python.org/library/subprocess.html#subprocess.Popen.wait. Тем не менее, я думаю, что это должно сработать. –