Python, os.system для вызова командной строки (linux), не возвращающего то, что нужно?
Мне нужно сделать некоторые вызовы командной строки в linux и получить возврат от этого, но делать это, как показано ниже, просто возвращает 0
, когда он должен вернуть значение времени, например 00:08:19
, я тестирую то же самое вызов в регулярной командной строке и возвращает значение времени 00:08:19
, поэтому я смущен тем, что я делаю неправильно, поскольку я думал, что это так, как это сделать в python. Любые советы приветствуются.
import os
retvalue = os.system("ps -p 2993 -o time --no-headers")
print retvalue
Ответы
Ответ 1
Возвращается возвращаемое значение для выполнения этой команды. То, что вы видите во время его непосредственного запуска, - это вывод команды в 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
ON SO: Popen и python
Ответ 2
Если вас интересует только результат процесса, проще всего использовать функцию check_output:
output = subprocess.check_output(["command", "arg1", "arg2"]);
Затем вывод выводит вывод программы на stdout. Для получения дополнительной информации см. Ссылку выше.
Ответ 3
Ваш код возвращает 0
, если выполнение переданных команд успешное и не равно нулю, если оно не выполнено. Следующая программа работает на python2.7, гавань проверена 3 и версии выше. Попробуйте этот код.
>>> import commands
>>> ret = commands.getoutput("ps -p 2993 -o time --no-headers")
>>> print ret
Ответ 4
Да, он интуитивно понятен и не кажется очень pythonic, но на самом деле просто имитирует дизайн API Unix, где эти calld являются функциями C POSIX. Проверьте 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).
Ответ 5
Самый простой способ:
import os
retvalue = os.popen("ps -p 2993 -o time --no-headers").readlines()
print retvalue
Это будет возвращено в виде списка
Ответ 6
Я не могу добавить комментарий к 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, в которых есть слово "файл" в любом месте. [...] - это понимание списка для удаления (strip) символа новой строки из каждой записи. 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
Ответ 7
Это старый поток, но с использованием 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
Не знаю, почему все они возвращают нули.
Ответ 8
Для вашего требования, функция Popen модуля subprocess 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
Ответ 9
okey Я считаю, что самым быстрым способом было бы
import os
print(os.popen('command').readline())
x = _
print(x)
Ответ 10
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