Вызов командной строки Linux не возвращает то, что он должен из os.system? - PullRequest
58 голосов
/ 25 сентября 2010

Мне нужно сделать несколько вызовов командной строки для linux и получить от этого ответ, однако выполнение этого, как показано ниже, просто возвращает 0, когда он должен вернуть значение времени, например 00:08:19, я тестирую точно так же Вызовите в обычной командной строке, и он возвращает значение времени 00:08:19, поэтому я запутался в том, что я делаю неправильно, потому что я думал, что это было, как это сделать в python.

import os
retvalue = os.system("ps -p 2993 -o time --no-headers")
print retvalue

Ответы [ 10 ]

99 голосов
/ 25 сентября 2010

Возвращаемое значение - это возвращаемое значение выполнения этой команды.То, что вы видите во время его непосредственного выполнения, является выводом команды в 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 and python

25 голосов
/ 25 сентября 2010

Если вас интересует только вывод процесса, проще всего использовать подпроцесс ' check_output функция:


output = subprocess.check_output(["command", "arg1", "arg2"]);

Затем вывод удерживает вывод программы в стандартный вывод. Проверьте ссылку выше для получения дополнительной информации.

10 голосов
/ 10 июня 2014

Самый простой способ выглядит так:

import os
retvalue = os.popen("ps -p 2993 -o time --no-headers").readlines()
print retvalue

Это будет возвращено в виде списка

8 голосов
/ 20 августа 2013

Ваш код возвращает 0, если выполнение переданных команд прошло успешно, и не равно нулю, если оно не выполнено. Следующая программа работает на python2.7, проверил 3 и версии выше. Попробуйте этот код.

>>> import commands
>>> ret = commands.getoutput("ps -p 2993 -o time --no-headers")
>>> print ret
2 голосов
/ 01 августа 2016

Я не могу добавить комментарий к IonicBurger , потому что у меня нет "50 репутации", поэтому я добавлю новую запись.Мои извенения. os.popen () лучше всего подходит для нескольких / сложных команд (на мой взгляд), а также для получения возвращаемого значения в дополнение к получению стандартного вывода, как следующие более сложные множественные команды:

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
2 голосов
/ 06 сентября 2013

Да, это нелогично и не кажется очень питонным, но на самом деле просто имитирует дизайн API Unix, где эти функции являются функциями 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).
1 голос
/ 24 июля 2015

Для ваших требований ответом является функция 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
1 голос
/ 31 июля 2014

Это старый поток, но с использованием os.system, следующий способ является допустимым способом доступа к данным, возвращаемым вызовом ps Примечание: он использует канал для записи данных в файл на диске. И ОП специально не запрашивал решение с использованием 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

Не знаю, почему все они возвращают нули.

0 голосов
/ 19 апреля 2017
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 
0 голосов
/ 07 мая 2012

Окей, я считаю, самый быстрый способ, которым это будет

import os
print(os.popen('command').readline())
x = _
print(x)
...