sourcecode

하위 프로세스를 사용하는 방법.파이썬에서 check_output()?

codebag 2023. 5. 23. 21:51
반응형

하위 프로세스를 사용하는 방법.파이썬에서 check_output()?

하위 프로세스에 대한 문서를 찾았습니다.check_output() 그러나 인수가 있는 것을 찾을 수 없고 문서의 깊이가 그리 깊지 않습니다.저는 파이썬 3을 사용하고 있습니다(그러나 파이썬 3을 통해 파이썬 2 파일을 실행하려고 합니다).

다음 명령을 실행하려고 합니다.python py2.py -i test.txt

-i는 argparse, test에 대한 위치 인수입니다.txt는 -i이고, py2.py 는 실행할 파일입니다.

다음과 같은 (비작동) 변형을 많이 시도했습니다.py2output = subprocess.check_output([str('python py2.py '),'-i', 'test.txt'])

py2output = subprocess.check_output([str('python'),'py2.py','-i', test.txt'])

정답(파이썬 2.7 이상 사용, 이후check_output() 소개됨)는 다음과 같습니다.

py2output = subprocess.check_output(['python','py2.py','-i', 'test.txt'])

다음은 두 가지 프로그램을 시연하기 위한 것입니다.

py2.py :

import sys
print sys.argv

py3.py :

import subprocess
py2output = subprocess.check_output(['python', 'py2.py', '-i', 'test.txt'])
print('py2 said:', py2output)

실행:

$ python3 py3.py
py2 said: b"['py2.py', '-i', 'test.txt']\n"

각 버전의 문제점은 다음과 같습니다.

py2output = subprocess.check_output([str('python py2.py '),'-i', 'test.txt'])

첫번째,str('python py2.py')와 정확히 같은 것입니다.'python py2.py'—당신은 시험을 보고 있습니다.str부름str그것을 로 변환하기 위해.str이것은 어떠한 이점도 추가하지 않고 코드를 읽기 어렵고, 더 길고, 더 느리게 만듭니다.

더 심각한 것은python py2.py당신이 실제로 프로그램을 실행하려고 하지 않는 한, 단일 주장이 될 수 없습니다, 예를 들어,/usr/bin/python\ py2.py당신은 도망치려고 하지 않습니다./usr/bin/python첫 번째 논쟁으로py2.py따라서 목록에서 각 요소를 구분해야 합니다.

두 번째 버전은 문제를 해결했지만, 당신은 그것을 놓치고 있습니다.'전에test.txt'이것은 당신에게 줄 것입니다.SyntaxError아마 말하는 것 같습니다.EOL while scanning string literal.

한편, 어떻게 문서를 찾으셨는지는 모르겠지만, 인수가 있는 예는 찾을 수 없었습니다.첫 번째 예는 다음과 같습니다.

>>> subprocess.check_output(["echo", "Hello World!"])
b'Hello World!\n'

그것은 그것을 부릅니다."echo"추가 인수가 있는 명령어,"Hello World!".

또한:

-i는 argparse, test에 대한 위치 인수입니다.txt는 -i가 무엇입니까?

난 거의 확신해.-i위치 인수가 아니라 선택적 인수입니다.그렇지 않으면, 문장의 후반부는 의미가 없습니다.

다음 대신 Python 3.5가 권장됩니다.

>>> subprocess.run(['cat','/tmp/text.txt'], check=True, stdout=subprocess.PIPE).stdout
b'First line\nSecond line\n'

Python 3.7 이후, 위의 것 대신에, 당신은capture_output=truestdout 및 stderr을 캡처하는 매개 변수:

>>> subprocess.run(['cat','/tmp/text.txt'], check=True, capture_output=True).stdout
b'First line\nSecond line\n'

또한 사용할 수도 있습니다.universal_newlines=True또는 Python 3.7 이후의 동등한 성능text=True이진 대신 텍스트로 작업하려면:

>>> stdout = subprocess.run(['cat', '/tmp/text.txt'], check=True, capture_output=True, text=True).stdout
>>> print(stdout)
First line
Second line

@abarnert가 언급한 것에 추가하는 것.

더 나은 것은 예외를 잡는 것입니다.

import subprocess
try:
    py2output = subprocess.check_output(['python', 'py2.py', '-i', 'test.txt'],stderr= subprocess.STDOUT)  
    #print('py2 said:', py2output)
    print "here"
except subprocess.CalledProcessError as e:
    print "Calledprocerr"

stderr= 하위 프로세스입니다.STDOUT는 stderr에서 file not found 오류가 발생하지 않도록 하기 위한 것입니다. 이 오류는 보통 file not found 예외에서 발견될 수 없습니다. 그렇지 않으면 결국 오류가 발생할 수 있습니다.

python: can't open file 'py2.py': [Errno 2] No such file or directory

실제로 이에 대한 더 나은 해결책은 파일/스크립트가 있는지 확인한 다음 파일/스크립트를 실행하는 것입니다.

@ravi.dll의 응답은 python 3에 대해 작동하고 0이 아닌 종료 코드 오류가 있을 때도 출력을 생성하도록 조정되었습니다.

try:
    out = subprocess.check_output(['git','commit','-m', commit_message], stderr= subprocess.STDOUT ).decode()
except subprocess.CalledProcessError as e:
    print ('[ERROR]: Exit code != 0')
    out = e.output.decode()
print(out)

언급URL : https://stackoverflow.com/questions/14078117/how-do-you-use-subprocess-check-output-in-python

반응형