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