programing

하위 프로세스의 출력을 저장합니다.콜을 문자열로 팝업하다

kingscode 2022. 12. 28. 22:13
반응형

하위 프로세스의 출력을 저장합니다.콜을 문자열로 팝업하다

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

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

여기서 몇 가지 제안을 포함하여 몇 가지 시도를 해봤습니다.

subprocess.call()의 출력을 취득하고 있습니다.

운도 없고요.

Python 2.7 또는 Python 3의 경우

Popen오브젝트를 직접 사용하면 명령어 출력을 문자열에 저장할 수 있습니다.

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

Python 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]

문제가 해결되지 않는 경우는, 문제를 정확하게 기술해 주세요.

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

from subprocess import PIPE, Popen

command = "ntpq -p"
process = Popen(command, stdout=PIPE, stderr=None, shell=True)
output = process.communicate()[0]
print output

에서 Popen의 shell는 True 입니다.명령어를 시퀀스가 아닌 문자열로 전달해야 합니다.그렇지 않으면 명령어를 목록으로 분할합니다.

command = ["ntpq", "-p"]
process = Popen(command, stdout=PIPE, stderr=None)

가 있는 는, 「Popen」을 설정할 필요가 .stderr파이프 또는 STDOUT:

command = "ntpq -p"
process = subprocess.Popen(command, stdout=PIPE, stderr=PIPE, shell=True)
output, error = process.communicate()

참고: Python 2.7 이후로는,subprocess.check_output( https://docs.python.org/2/library/subprocess.html#subprocess.check_output) )를 참조해 주세요.


Python 3: https://docs.python.org/3/library/subprocess.html#subprocess.Popen

from subprocess import PIPE, Popen

command = "ntpq -p"
with Popen(command, stdout=PIPE, stderr=None, shell=True) as process:
    output = process.communicate()[0].decode("utf-8")
    print(output)

참고: 3.5 이상의 Python 버전만을 대상으로 하는 경우, 다음과 같은 기능을 이용할 수 있습니다.subprocess.run( https://docs.python.org/3/library/subprocess.html#subprocess.run) )를 참조해 주세요.

Python 3.7+에서는 새로운 버전을 사용할 수 있습니다.capture_output=키워드 인수:

import subprocess

p = subprocess.run(["echo", "hello world!"], capture_output=True, text=True)
assert p.stdout == 'hello world!\n'

「 」라고 하는 에,pwd예를 들어 다음과 같이 할 수단은 다음과 같습니다.

import subprocess

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

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

Python 2.7+의 경우 관용적인 대답은

서브프로세스를 호출할 때는 조금 혼란스러울 수 있으므로 인수 처리도 주의해 주십시오.

args가 자체 args가 없는 단일 명령어일 경우(또는shell=Trueset), 문자열일 수 있습니다.그렇지 않으면 목록일 것입니다.

예를 들어...를 호출하다ls명령어는 다음과 같습니다.

from subprocess import check_call
check_call('ls')

이것도 마찬가지입니다.

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

단, 일부 arg를 shell 명령어에 전달하는 경우에는 다음과 같이 할 수 없습니다.

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

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

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

이 함수는 하위 프로세스를 작성하기 전에 문자열을 셸과 같은 구문으로 분할하는 데 유용할 수 있습니다.다음과 같습니다.

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]

새로운 기능에 대한 몇 가지 언급만 하면, 인정된 답변은 여전히 유효합니다.python 3.6 이후, 당신은 직접 인코딩을 처리할 수 있습니다.check_output매뉴얼을 참조해 주세요.그러면 문자열 개체가 반환됩니다.

import subprocess 
out = subprocess.check_output(["ls", "-l"], encoding="utf-8")

python 3.7에서는 파라미터capture_outputsubprocess.run()에 추가되어 Popen/PIPE 처리가 일부 이루어집니다.python 문서를 참조해 주세요.

import subprocess 
p2 = subprocess.run(["ls", "-l"], capture_output=True, encoding="utf-8")
p2.stdout

여기 다른 답변을 바탕으로 함수를 작성했습니다.

def pexec(*args):
    return subprocess.Popen(args, stdout=subprocess.PIPE).communicate()[0].rstrip()

사용방법:

changeset = pexec('hg','id','--id')
branch = pexec('hg','id','--branch')
revnum = pexec('hg','id','--num')
print('%s : %s (%s)' % (revnum, changeset, branch))
 import os   
 list = os.popen('pwd').read()

이 경우 목록에는 하나의 요소만 포함됩니다.

다음으로 프로세스의 stdout과 stderr을 단일 변수로 캡처합니다.Python 2와 3에 대응하고 있습니다.

from subprocess import check_output, CalledProcessError, STDOUT

command = ["ls", "-l"]
try:
    output = check_output(command, stderr=STDOUT).decode()
    success = True 
except CalledProcessError as e:
    output = e.output.decode()
    success = False

명령어가 배열이 아닌 문자열인 경우 이 앞에 다음을 붙입니다.

import shlex
command = shlex.split(command)
import subprocess
output = str(subprocess.Popen("ntpq -p",shell = True,stdout = subprocess.PIPE, 
stderr = subprocess.STDOUT).communicate()[0])

이것은 한 줄의 솔루션입니다.

사용하다check_output의 방법subprocess모듈

import subprocess

address = '192.168.x.x'
res = subprocess.check_output(['ping', address, '-c', '3'])

마지막으로 문자열을 해석합니다.

for line in res.splitlines():

도움이 되길 바래, 해피 코딩

python 3.5의 경우 이전 답변을 바탕으로 기능을 올렸습니다.로그가 삭제될 수 있습니다.그것은, 좋은 일이라고 생각됩니다.

import shlex
from subprocess import check_output, CalledProcessError, STDOUT


def cmdline(command):
    log("cmdline:{}".format(command))
    cmdArr = shlex.split(command)
    try:
        output = check_output(cmdArr,  stderr=STDOUT).decode()
        log("Success:{}".format(output))
    except (CalledProcessError) as e:
        output = e.output.decode()
        log("Fail:{}".format(output))
    except (Exception) as e:
        output = str(e);
        log("Fail:{}".format(e))
    return str(output)


def log(msg):
    msg = str(msg)
    d_date = datetime.datetime.now()
    now = str(d_date.strftime("%Y-%m-%d %H:%M:%S"))
    print(now + " " + msg)
    if ("LOG_FILE" in globals()):
        with open(LOG_FILE, "a") as myfile:
            myfile.write(now + " " + msg + "\n")

언급URL : https://stackoverflow.com/questions/2502833/store-output-of-subprocess-popen-call-in-a-string

반응형