Linux Command-Line Вызов не возвращается, что он должен от OS.System?

StackOverflow https://stackoverflow.com/questions/3791465

Вопрос

Мне нужно сделать некоторую командную строку звонить в 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 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top