Вызов командной строки Linux не возвращает то, что он должен из ОС.система?



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



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

10 ответов:

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

НА ТАК : Попен и питон

Если вас интересует только результат процесса, проще всего использовать подпроцесс' 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

Да, это контр-интуитивно понятный и, кажется, не очень подходящие для Python, но это на самом деле только имитирует дизайн API-интерфейса Unix, где эти называли несколько функций C в POSIX. Проверьте man 3 popen &&man 3 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 репутации" так Я добавлю новую запись. Мое извинение. ОС.к 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, которые имеют слово '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

Это старый поток, но чисто с помощью 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 модуль является ответом. Например,

import subprocess
..
process = subprocess.Popen("ps -p 2993 -o time --no-headers", stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
print stdout

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

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 

Comments

    Ничего не найдено.