[python] 하위 프로세스의 출력을 문자열에 저장합니다.

파이썬에서 시스템 호출을 만들고 파이썬 프로그램에서 조작 할 수있는 문자열에 출력을 저장하려고합니다.

#!/usr/bin/python
import subprocess
p2 = subprocess.Popen("ntpq -p")

여기에 몇 가지 제안을 포함하여 몇 가지 시도를했습니다.

subprocess.call ()의 출력 검색

그러나 운없이.



답변

Python 2.7 또는 Python 3에서

Popen객체를 직접 만드는 대신 subprocess.check_output()함수 를 사용하여 명령의 출력을 문자열에 저장할 수 있습니다 .

from subprocess import check_output
out = check_output(["ntpq", "-p"])

파이썬 2.4-2.6에서

communicate방법을 사용하십시오 .

import subprocess
p = subprocess.Popen(["ntpq", "-p"], stdout=subprocess.PIPE)
out, err = p.communicate()

out 당신이 원하는 것입니다.

다른 답변에 대한 중요 사항

내가 명령을 어떻게 전달했는지 주목하십시오. 이 "ntpq -p"예는 또 다른 문제를 제기합니다. Popen쉘을 호출하지 않기 때문에 명령 및 옵션 목록 —을 사용합니다 ["ntpq", "-p"].


답변

이것은 stdout을 리디렉션하는 데 도움이되었습니다 (stderr도 비슷하게 처리 할 수 ​​있습니다).

from subprocess import Popen, PIPE
pipe = Popen(path, stdout=PIPE)
text = pipe.communicate()[0]

그래도 문제가 해결되지 않으면 발생한 문제를 정확하게 지정하십시오.


답변

pwd이것이 단지 예 라고 가정하면 다음과 같이 할 수 있습니다.

import subprocess

p = subprocess.Popen("pwd", stdout=subprocess.PIPE)
result = p.communicate()[0]
print result

다른 예 와 자세한 내용은 하위 프로세스 설명서 를 참조하십시오.


답변

subprocess.Popen : http://docs.python.org/2/library/subprocess.html#subprocess.Popen

import subprocess

command = "ntpq -p"  # the shell command
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None, shell=True)

#Launch the shell command:
output = process.communicate()

print output[0]

Popen 생성자에서 shellTrue 인 경우 명령을 시퀀스가 ​​아닌 문자열로 전달해야합니다. 그렇지 않으면 명령을 목록으로 나누십시오.

command = ["ntpq", "-p"]  # the shell command
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None)

당신이는 popen 초기화로, 또한 표준 오류를 읽을 필요가 있다면, 당신은 설정할 수 있습니다 열려진subprocess.PIPE 하거나 subprocess.STDOUT :

import subprocess

command = "ntpq -p"  # the shell command
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

#Launch the shell command:
output, error = process.communicate()


답변

파이썬 2.7+의 경우 관용적 인 대답은 subprocess.check_output()

또한 서브 프로세스를 호출 할 때 인수를 다루는 것이 약간 혼란 스러울 수 있으므로주의해야합니다.

args가 자신 만의 args가없는 단일 명령 인 경우 (또는 shell=True설정 한 경우) 문자열 일 수 있습니다. 그렇지 않으면 목록이어야합니다.

예를 들어 … ls명령 을 호출하려면 다음 과 같이하십시오.

from subprocess import check_call
check_call('ls')

이것도 마찬가지입니다 :

from subprocess import check_call
check_call(['ls',])

그러나 일부 args를 쉘 명령에 전달하려면 다음 수행 할 수 없습니다 .

from subprocess import check_call
check_call('ls -al')

대신 목록으로 전달해야합니다.

from subprocess import check_call
check_call(['ls', '-al'])

그만큼 shlex.split() 함수는 하위 프로세스를 만들기 전에 문자열을 쉘과 같은 구문으로 나누는 데 유용 할 수 있습니다.

from subprocess import check_call
import shlex
check_call(shlex.split('ls -al'))


답변

이것은 나를 위해 완벽하게 작동합니다.

import subprocess
try:
    #prints results and merges stdout and std
    result = subprocess.check_output("echo %USERNAME%", stderr=subprocess.STDOUT, shell=True)
    print result
    #causes error and merges stdout and stderr
    result = subprocess.check_output("copy testfds", stderr=subprocess.STDOUT, shell=True)
except subprocess.CalledProcessError, ex: # error code <> 0 
    print "--------error------"
    print ex.cmd
    print ex.message
    print ex.returncode
    print ex.output # contains stdout and stderr together 


답변

이것은 나에게 완벽했다. 리턴 코드, stdout 및 stderr가 튜플에 표시됩니다.

from subprocess import Popen, PIPE

def console(cmd):
    p = Popen(cmd, shell=True, stdout=PIPE)
    out, err = p.communicate()
    return (p.returncode, out, err)

예를 들어 :

result = console('ls -l')
print 'returncode: %s' % result[0]
print 'output: %s' % result[1]
print 'error: %s' % result[2]