it-swarm.com.ru

Вы не можете вернуться из командной строки в Linux?

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

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

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

98
pyfunc

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


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

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

25
JoshD

Самый простой способ такой:

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

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

10
IonicBurger

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

>>> import commands
>>> ret = commands.getoutput("ps -p 2993 -o time --no-headers")
>>> print ret
8
vikkyhacks

Я не могу добавить комментарий к 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' в любом месте своего имени. [...] является списком для удаления (удаления) символа новой строки из каждой записи. The 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
Joe

Да, он нелогичен и не выглядит как Pythonic, но на самом деле он просто имитирует дизайн Unix API, где эти функции являются функциями 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).
2
Yauhen Yakimovich

Для вашего требования, функция 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
Asif Hasnain

Это старый поток, но с использованием 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

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

1
Coriolis Force

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

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