Вопрос-Ответ

Assign output of os.system to a variable and prevent it from being displayed on the screen [duplicate]

Присвоить выходные данные os.system переменной и запретить их отображение на экране

Я хочу присвоить выходные данные команды, которую я запускаю с помощью os.system, переменной и запретить их вывод на экран. Но в приведенном ниже коде выходные данные отправляются на экран, а значение, напечатанное для var равно 0, что, я полагаю, означает, успешно ли выполнена команда или нет. Есть ли какой-нибудь способ присвоить выходные данные команды переменной, а также запретить их отображение на экране?

var = os.system("cat /etc/services")
print var #Prints 0
Переведено автоматически
Ответ 1

Из этого вопроса, который я задавал давным-давно, вы можете захотеть использовать popen:

os.popen('cat /etc/services').read()

Из документации по Python 3.6,


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



Вот соответствующий код для subprocess:

import subprocess

proc = subprocess.Popen(["cat", "/etc/services"], stdout=subprocess.PIPE, shell=True)
(out, err) = proc.communicate()
print("program output:", out)
Ответ 2

Возможно, вы также захотите взглянуть на subprocess модуль, который был создан для замены всего семейства вызовов типа Python popen.

import subprocess
output = subprocess.check_output("cat /etc/services", shell=True)

Преимущество этого заключается в том, что существует тонна гибкости в том, как вы вызываете команды, где подключены стандартные потоки ввода / вывода / ошибок и т.д.

Ответ 3

Модуль commands - это достаточно высокоуровневый способ сделать это:

import commands
status, output = commands.getstatusoutput("cat /etc/services")

состояние равно 0, выходные данные представляют собой содержимое /etc/services .

Ответ 4

Для python 3.5+ рекомендуется использовать функцию run из модуля subprocess. Это возвращает CompletedProcess объект, из которого вы можете легко получить выходные данные, а также код возврата. Поскольку вас интересуют только выходные данные, вы можете написать утилиту-оболочку, подобную этой.

from subprocess import PIPE, run

def out(command):
result = run(command, stdout=PIPE, stderr=PIPE, universal_newlines=True, shell=True)
return result.stdout

my_output = out("echo hello world")
# Or
my_output = out(["echo", "hello world"])
python