Python : os.system을 실행 한 후 stdout을 얻는 방법?
호출 stdout
을 실행 한 후 변수 를 얻고 싶습니다 os.system
.
다음 줄을 예로 들어 보겠습니다.
batcmd="dir"
result = os.system(batcmd)
result
오류 코드가 포함됩니다 ( 위의 예에서는 stderr
0
Windows 또는 1
일부 Linux).
stdout
실행 된 명령에서 리디렉션을 사용하지 않고 위 명령에 대해 어떻게 얻을 수 있습니까?
stdout
출력 만 있으면 다음을 살펴보십시오 subprocess.check_output()
(Python 2.7에 추가됨).
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)
오류 출력을 기본 출력 스트림으로 리디렉션합니다.
이 답변은 저에게 효과적이지 않았습니다. 다음을 사용해야했습니다.
import subprocess
p = subprocess.Popen(["pwd"], stdout=subprocess.PIPE)
out = p.stdout.read()
print out
또는 함수로 (shell = True 사용은 Python 2.6.7에서 필요했고 check_output은 2.7까지 추가되지 않아 여기서 사용할 수 없습니다) :
def system_call(command):
p = subprocess.Popen([command], stdout=subprocess.PIPE, shell=True)
return p.stdout.read()
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에서 디렉터리 목록을 포함하여 내가 기대하는 모든 것을 얻습니다. 우후!
이제 DOS Python 명령 창에서 스위치없이 또는 / K 스위치를 사용하여 동일한 작업을 시도하면 하위 프로세스 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 창이 열리고 남아 있으며 디렉토리 목록을 포함하여 예상되는 모든 출력이 표시됩니다.
DOS Python 명령 창에서 동일한 작업 (subprocess.check_output 대신 subprocess.call)을 시도하면; 모든 출력이 동일한 창에 있으며 팝업 창이 없습니다. 스위치가 없으면 "dir"부분이 다시 무시되고 프롬프트가 파이썬 프롬프트에서 DOS 프롬프트로 변경됩니다 (cmd.exe 하위 프로세스가 파이썬에서 실행 중이므로 다시 'exit'를 입력하면 파이썬 프롬프트로 돌아갑니다). ). / K 스위치를 추가하면 디렉토리 목록이 인쇄되고 / K가 하위 프로세스를 종료하지 않기 때문에 프롬프트가 python에서 DOS로 변경됩니다. 스위치를 / C로 변경하면 예상되는 모든 출력이 제공되고 / C에 따라 하위 프로세스가 종료되기 때문에 파이썬 프롬프트로 돌아갑니다.
장황한 답변에 대해 미안하지만 기껏해야 작동하지 않는 많은 간결한 '답변'(스위치가없는 Eduard F의 응답과 같이 테스트되지 않았기 때문에 보임)으로이 게시판에서 실망합니다. 더 나쁜 것은 너무 간결해서 전혀 도움이되지 않습니다 (예 : 'os.system 대신 하위 프로세스 시도'... 예, 좋아, 이제 뭐야?). 대조적으로, 나는 내가 테스트 한 솔루션을 제공하고 그들 사이에 미묘한 차이가 있음을 보여주었습니다. 많은 시간이 걸렸지 만 ... 도움이 되었기를 바랍니다.
commands
또한 작동합니다.
import commands
batcmd = "dir"
result = commands.getoutput(batcmd)
print result
Linux, python 2.7에서 작동합니다.
하위 프로세스가 더 큰 작업에 대해 메모리 오류를 제공했기 때문에 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)
import subprocess
string="echo Hello world"
result=subprocess.getoutput(string)
print("result::: ",result)
참고URL : https://stackoverflow.com/questions/18739239/python-how-to-get-stdout-after-running-os-system
'code' 카테고리의 다른 글
JavaScript에서 ISO 날짜를 날짜 형식 yyyy-mm-dd로 변환 (0) | 2020.10.20 |
---|---|
Git은 파일 재설정 / 삭제를 거부합니다. (0) | 2020.10.19 |
Spring Boot application.properties 값이 채워지지 않음 (0) | 2020.10.19 |
(…) 쿼리에서 HQL을 작성하는 적절한 방법 (0) | 2020.10.19 |
Func 및 Action에 해당하는 Java의 기능 (0) | 2020.10.19 |