source

Python: os.system을 실행한 후 stdout을 실행하는 방법은 무엇입니까?

goodcode 2023. 8. 24. 22:36
반응형

Python: os.system을 실행한 후 stdout을 실행하는 방법은 무엇입니까?

저는 그것을 받고 싶습니다.stdout를 실행한 후 변수에os.system불러.

이 행을 예로 들어 보겠습니다.

batcmd="dir"
result = os.system(batcmd)

result오류 코드를 포함합니다(stderr 0Windows 또는1위의 예에 대한 일부 리눅스 아래).

어떻게 하면 얻을 수 있습니까?stdout실행된 명령에서 리디렉션을 사용하지 않고 위 명령에 대해?

당신이 필요한 것이 단지stdout출력한 다음 다음을 살펴봅니다.

import subprocess

batcmd="dir"
result = subprocess.check_output(batcmd, shell=True)

당신이 사용했기 때문에os.system()설정해야 합니다.shell=True같은 행동을 하는 것.신뢰할 수 없는 인수를 셸에 전달하는 것에 대한 보안 문제에 주의해야 합니다.

캡처가 필요한 경우stderr또한, 간단히 추가합니다.stderr=subprocess.STDOUT호출:

result = subprocess.check_output([batcmd], stderr=subprocess.STDOUT)

오류 출력을 기본 출력 스트림으로 리디렉션합니다.

출력이 텍스트인 것을 알고 있는 경우,text=True플랫폼 기본 인코딩으로 반환된 바이트 값을 디코딩합니다.encoding="..."수신하는 데이터에 대해 코덱이 올바르지 않은 경우 대신 사용할 수 있습니다.

이 대답들은 저에게 효과가 없었습니다.다음을 사용해야 했습니다.

import subprocess
p = subprocess.Popen(["pwd"], stdout=subprocess.PIPE)
out = p.stdout.read()
print out

또는 함수로서 (Python 2.6.7에서 shell=True를 사용해야 했으며 check_output은 2.7까지 추가되지 않아 여기서 사용할 수 없게 되었습니다):

def system_call(command):
    p = subprocess.Popen([command], stdout=subprocess.PIPE, shell=True)
    return p.stdout.read()
import subprocess
string="echo Hello world"
result=subprocess.getoutput(string)
print("result::: ",result)

하위 프로세스가 더 큰 작업에 대한 메모리 오류를 제공하기 때문에 os.system을 사용해야 했습니다.문제에 대한 참조입니다.그래서 os.system 명령어의 출력을 얻기 위해 다음 해결 방법을 사용했습니다.

import os

batcmd = 'dir'
result_code = os.system(batcmd + ' > output.txt')
if os.path.exists('output.txt'):
    fp = open('output.txt', "r")
    output = fp.read()
    fp.close()
    os.remove('output.txt')
    print(output)

Windows 솔루션을 확장하고 싶습니다.Python 2.7.5에서 IDLE 사용, 파일 Expts에서 이 코드를 실행할 때.py:

import subprocess
r = subprocess.check_output('cmd.exe dir',shell=False) 
print r

...Python Shell에서는 "cmd.exe"에 해당하는 출력만 받습니다. "dir" 부분은 무시됩니다.하지만 /K 또는 /C와 같은 스위치를 추가하면...

import subprocess
r = subprocess.check_output('cmd.exe /K dir',shell=False) 
print r

...Python Shell에서는 디렉터리 목록을 포함하여 원하는 모든 것을 얻을 수 있습니다.우후!

이제 스위치를 사용하지 않거나 /K 스위치를 사용하여 DOS Python 명령 창에서 동일한 작업을 시도하면 하위 프로세스 cmd.exe를 실행하고 추가 입력을 기다리는 중이므로 창이 중단되는 것처럼 보입니다. 'exit'을 입력한 다음 [enter]를 눌러 릴리스합니다.하지만 /K 스위치를 사용하면 완벽하게 작동하고 파이썬 프롬프트로 돌아갑니다.좋아요 그럼.

한 걸음 더 나아가서는...난 이게 멋지다고 생각했어요...Expts에서 대신 이 작업을 수행할 때.py:

import subprocess
r = subprocess.call("cmd.exe dir",shell=False) 
print r

...새 DOS 창이 열리고 "dir"가 아닌 "cmd.exe"의 결과만 표시됩니다./C 스위치를 추가하면 DOS 창이 매우 빠르게 열리고 닫힙니다(예상대로 /C가 완료되면 종료되므로).대신 /K 스위치를 추가하면 DOS 창이 열리고 그대로 유지되며 디렉토리 목록을 포함하여 예상되는 모든 출력을 얻을 수 있습니다.

만약 내가 같은 시도를 한다면 (subprocess 대신 subprocess.call).check_output)는 DOS Python 명령 창에서 실행되며, 모든 출력은 동일한 창 내에 있으며 팝업 창은 없습니다.스위치가 없으면 다시 "dir" 부분이 무시되고 프롬프트가 python 프롬프트에서 DOS 프롬프트로 바뀝니다(cmd 이후).exe 하위 프로세스가 python에서 실행 중입니다. 다시 'python'을 입력하면 python 프롬프트로 돌아갑니다./K 스위치를 추가하면 디렉토리 목록이 출력되고 /K는 하위 프로세스를 종료하지 않으므로 프롬프트가 python에서 DOS로 변경됩니다.스위치를 /C로 변경하면 예상되는 모든 출력이 제공되며 하위 프로세스가 /C에 따라 종료되므로 python 프롬프트로 돌아갑니다.

장황한 답변에 죄송합니다. 기껏해야 작동하지 않는(테스트되지 않았기 때문에 보이는 - 스위치가 누락된 위의 Eduard F의 응답처럼) 또는 더 나쁜 '답변'이 너무 거칠어서 전혀 도움이 되지 않습니다(예: 'OS 시스템 대신 하위 프로세스를 사용해 보십시오').네, 좋아요, 이제 뭐죠?)대조적으로, 저는 제가 테스트한 솔루션을 제공했고 그것들 사이에 미묘한 차이가 어떻게 있는지 보여주었습니다.시간이 많이 걸렸지만...이게 도움이 되길 바랍니다.

commands작동하기도 합니다.

import commands
batcmd = "dir"
result = commands.getoutput(batcmd)
print result

리눅스, 파이썬 2.7에서 작동합니다.

언급URL : https://stackoverflow.com/questions/18739239/python-how-to-get-stdout-after-running-os-system

반응형