Вызов командной строки Linux не возвращает то, что он должен из ОС.система?
мне нужно сделать некоторые вызовы командной строки в linux и получить возврат от этого, однако делать это, как показано ниже, просто возвращает 0 когда он должен возвращать значение времени, например 00:08:19, Я тестирую точно такой же вызов в обычной командной строке, и он возвращает значение времени 00:08:19 Так что я в замешательстве относительно того, что я делаю неправильно, как я думал, что это было, как это сделать в python.
import os
retvalue = os.system("ps -p 2993 -o time --no-headers")
print retvalue
10 ответов:
возвращается возвращаемое значение выполнения этой команды. То, что вы видите при непосредственном выполнении, является результатом команды в stdout. То, что 0 возвращается означает, что не было ошибки в выполнении.
использовать к popen и т. д. Для захвата выходных данных .
некоторые вещи вдоль этой линии:
import subprocess as sub p = sub.Popen(['your command', 'arg1', 'arg2', ...],stdout=sub.PIPE,stderr=sub.PIPE) output, errors = p.communicate() print outputили
import os p = os.popen('command',"r") while 1: line = p.readline() if not line: break print lineНА ТАК : Попен и питон
Если вас интересует только результат процесса, проще всего использовать подпроцесс' check_output:
output = subprocess.check_output(["command", "arg1", "arg2"]);затем вывод содержит вывод программы в stdout. Проверьте ссылку выше для получения дополнительной информации.
самый простой способ выглядит так:
import os retvalue = os.popen("ps -p 2993 -o time --no-headers").readlines() print retvalueЭто будет возвращено в виде списка
ваш код возвращает
0если выполнение переданных команд является успешным и ненулевым, если это не удается. Следующая программа работает на python2.7, haven проверил 3 и версии выше. Попробуйте этот код.>>> import commands >>> ret = commands.getoutput("ps -p 2993 -o time --no-headers") >>> print ret
Да, это контр-интуитивно понятный и, кажется, не очень подходящие для Python, но это на самом деле только имитирует дизайн API-интерфейса Unix, где эти называли несколько функций C в POSIX. Проверьте
man 3 popen&&man 3 systemнесколько более удобный фрагмент для замены ОС.система что я использую:
from subprocess import (PIPE, Popen) def invoke(command): ''' Invoke command as a new system process and return its output. ''' return Popen(command, stdout=PIPE, shell=True).stdout.read() result = invoke('echo Hi, bash!') # Result contains standard output (as you expected it in the first place).
Я не могу добавить комментарий к IonicBurger потому что у меня нет "50 репутации" так Я добавлю новую запись. Мое извинение. ОС.к popen() лучше всего подходит для нескольких / сложных команд (мое мнение), а также для получения возвращаемого значения в дополнение к получению stdout, как следующие более сложные несколько команд:
import os out = [ i.strip() for i in os.popen(r"ls *.py | grep -i '.*file' 2>/dev/null; echo $? ").readlines()] print " stdout: ", out[:-1] print "returnValue: ", out[-1]это будет список всех файлов python, которые имеют слово 'file' в любом месте на свое имя. Этот [...] это понимание списка для удаления (полосы) символа новой строки из каждой записи. Элемент echo $? - это команда оболочки для отображения состояния возврата последней выполненной команды, которая будет командой grep и последним элементом списка в этом примере. элемент 2>/dev / null говорит для печати stderr на grep до /dev / null поэтому он не отображается в выходных данных. Элемент 'r' перед 'ls' команда должна использовать необработанную строку, чтобы оболочка не интерпретировала метасимволы, такие как '*' неправильно. Это работает в Python 2.7. Вот пример вывода:
stdout: ['fileFilter.py', 'fileProcess.py', 'file_access..py', 'myfile.py'] returnValue: 0
Это старый поток, но чисто с помощью
os.system, ниже приведен допустимый способ доступа к данным, возвращеннымpsзвонок. Примечание: он использует канал для записи данных в файл на диске. и OP специально не просил решения с помощьюos.system.>>> os.system("ps > ~/Documents/ps.txt") 0 #system call is processed. >>> os.system("cat ~/Documents/ps.txt") PID TTY TIME CMD 9927 pts/0 00:00:00 bash 10063 pts/0 00:00:00 python 12654 pts/0 00:00:00 sh 12655 pts/0 00:00:00 ps 0соответственно,
>>> os.system("ps -p 10063 -o time --no-headers > ~/Documents/ps.txt") 0 >>> os.system("cat ~/Documents/ps.txt") 00:00:00 0не знаю, почему они все возвращаются нули.
для вашего требования, Popen функция подпроцесса python модуль является ответом. Например,
import subprocess .. process = subprocess.Popen("ps -p 2993 -o time --no-headers", stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = process.communicate() print stdout
Окей я считаю, что самый быстрый способ это будет
import os print(os.popen('command').readline()) x = _ print(x)
using commands module import commands """ Get high load process details """ result = commands.getoutput("ps aux | sort -nrk 3,3 | head -n 1") print result -- python 2x print (result) -- python 3x
Comments