Linux Command-Line Вызов не возвращается, что он должен от OS.System?
-
05-10-2019 - |
Вопрос
Мне нужно сделать некоторую командную строку звонить в Linux и получить возврат от этого, однако делает его как ниже, просто возвращается 0
Когда он должен вернуть время времени, как 00:08:19
, Я проверяю тот же звонок в обычной командной строке, и он возвращает значение времени 00:08:19
Поэтому я запутался относительно того, что я делаю не так, как я думал, это как это сделать в Python.
import os
retvalue = os.system("ps -p 2993 -o time --no-headers")
print retvalue
Решение
То, что возвращается, это возвращаемое значение выполнения этой команды. То, что вы видите во время его выполнения напрямую, является выходом команды в 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
На так: Popen и Python
Другие советы
Если вы заинтересованы только в выходе из процесса, легче всего использовать подпроцесс 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
Да, это противоположно и не кажется очень пифитонным, но на самом деле он просто подразумевает дизайн API Unix API, где эти Calld являются функциями PSIX. Проверить man 3 popen
&& man 3 system
Несколько удобный фрагмент для замены os.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 репутации», поэтому я добавлю новую запись. Мои извенения. OS.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, которые имеют слово 'файл' в любом месте их имени. То [...] это понимание списка для удаления (полоса) новинка символа из каждой записи. То echo $? Это команда Shell для отображения возвращаемого статуса последней команды, выполненной, которая будет команда GREP и последний элемент списка в этом примере. то 2> / dev / null говорит, чтобы распечатать север принадлежащий овладеть команда к / dev / null Так что он не отображается в выходе. То 'р' перед 'ls' Команда - использовать RAW String, чтобы оболочку не интерпретируют, как '*' неправильно. Это работает в 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 Module является ответ. Например,
import subprocess
..
process = subprocess.Popen("ps -p 2993 -o time --no-headers", stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
print stdout
okeeke Я считаю самым быстрым способом, это было бы
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