Program Tip

Linux 명령 줄 호출이 os.system에서해야하는 것을 반환하지 않습니까?

programtip 2020. 12. 10. 21:02
반응형

Linux 명령 줄 호출이 os.system에서해야하는 것을 반환하지 않습니까?


나는 리눅스에 몇 가지 명령 줄 호출을하고 이것에서 반환을 얻어야한다. 그러나 아래와 같이 0하는 것은 시간 값을 반환해야 할 때를 반환하는 것이다. 예를 들어 00:08:19, 나는 정규 명령 줄에서 똑같은 호출을 테스트하고 있으며 시간 가치 00:08:19그래서 나는 이것이 파이썬에서 그것을하는 방법이라고 생각했기 때문에 내가 뭘 잘못하고 있는지 혼란 스럽습니다.

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

ON SO : Popen과 파이썬


프로세스의 출력에만 관심이 있다면 하위 프로세스의 check_output 함수 를 사용하는 것이 가장 쉽습니다 .


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

그런 다음 출력은 프로그램 출력을 표준 출력으로 유지합니다. 자세한 내용은 위의 링크를 확인하십시오.


가장 간단한 방법은 다음과 같습니다.

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

이것은 목록으로 반환됩니다


0전달 된 명령 실행이 성공하면 코드가 반환 되고 실패하면 0이 아닙니다. 다음 프로그램은 python2.7에서 작동하며 3 및 위 버전을 확인했습니다. 이 코드를 사용해보십시오.

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

예, 반 직관적이고 비단뱀처럼 보이지는 않지만 실제로는 C POSIX 함수가 호출되는 유닉스 API 디자인을 모방합니다. 확인 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]

이름에 'file' 이라는 단어가있는 모든 파이썬 파일이 나열됩니다 . [...] 의 각 항목에서 개행 문자를 제거 (스트립)하는 지능형리스트이다. 에코 $? 이 예제에서 grep 명령과 목록의 마지막 항목이 될 마지막으로 실행 된 명령의 반환 상태를 표시하는 셸 명령입니다. 2>는 / dev / null가 인쇄 말한다 표준 에러그렙 명령을 을 / dev / null 가 출력에 표시되지 않도록. 'ls' 명령 'r' 은 원시 문자열을 사용하므로 쉘이 '*' 와 같은 메타 문자를 해석하지 않습니다. incorrectly. This works in python 2.7. Here is the sample output:

      stdout:  ['fileFilter.py', 'fileProcess.py', 'file_access..py', 'myfile.py']
 returnValue:  0

This is an old thread, but purely using os.system, the following's a valid way of accessing the data returned by the ps call. Note: it does use a pipe to write the data to a file on disk. And OP didn't specifically ask for a solution using 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

accordingly,

>>> os.system("ps -p 10063 -o time --no-headers > ~/Documents/ps.txt")
0
>>> os.system("cat ~/Documents/ps.txt")
00:00:00
0

No idea why they are all returning zeroes though.


For your requirement, Popen function of subprocess python module is the answer. For example,

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

okey I believe the fastest way it would be

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 

참고URL : https://stackoverflow.com/questions/3791465/linux-command-line-call-not-returning-what-it-should-from-os-system

반응형