Присвойте вывод os.system переменной и предотвратите ее отображение на экране - PullRequest
231 голосов
/ 17 августа 2010

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

var = os.system("cat /etc/services")
print var #Prints 0

Ответы [ 7 ]

341 голосов
/ 17 августа 2010

Из " Эквивалента Bash Backticks в Python ", который я давно спрашивал, что вы можете использовать, это 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
152 голосов
/ 17 августа 2010

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

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

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

43 голосов
/ 17 августа 2010

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

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

состояние равно 0, вывод - это содержимое /etc/services.

21 голосов
/ 22 мая 2014

Я знаю, что на этот вопрос уже был дан ответ, но я хотел бы поделиться потенциально более привлекательным способом вызова Popen с помощью from x import x и функций:

from subprocess import PIPE, Popen


def cmdline(command):
    process = Popen(
        args=command,
        stdout=PIPE,
        shell=True
    )
    return process.communicate()[0]

print cmdline("cat /etc/services")
print cmdline('ls')
print cmdline('rpm -qa | grep "php"')
print cmdline('nslookup google.com')
18 голосов
/ 17 марта 2016

Для python 3.5+ рекомендуется использовать функцию запуска из модуля подпроцесса . Это возвращает 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"])
2 голосов
/ 07 сентября 2015

я делаю это с помощью временного файла os.system:

import tempfile,os
def readcmd(cmd):
    ftmp = tempfile.NamedTemporaryFile(suffix='.out', prefix='tmp', delete=False)
    fpath = ftmp.name
    if os.name=="nt":
        fpath = fpath.replace("/","\\") # forwin
    ftmp.close()
    os.system(cmd + " > " + fpath)
    data = ""
    with open(fpath, 'r') as file:
        data = file.read()
        file.close()
    os.remove(fpath)
    return data
1 голос
/ 01 июля 2016

В Python 2.6 и 3 специально сказано, чтобы не использовать PIPE для stdout и stderr.

Правильный путь

import subprocess

# must create a file object to store the output. Here we are getting
# the ssid we are connected to
outfile = open('/tmp/ssid', 'w');
status = subprocess.Popen(["iwgetid"], bufsize=0, stdout=outfile)
outfile.close()

# now operate on the file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...