IT Share you

파이썬에서 subprocess.check_output ()을 어떻게 사용합니까?

shareyou 2020. 12. 12. 12:39
반응형

파이썬에서 subprocess.check_output ()을 어떻게 사용합니까?


subprocess.check_output ()에 대한 문서를 찾았지만 인수가있는 문서를 찾을 수 없으며 문서가 그다지 깊이 있지 않습니다. Python 3을 사용하고 있지만 Python 3을 통해 Python 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'])


정답 (Python 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입니다 하지 의 위치 인수하지만, 선택적 인수. 그렇지 않으면 문장의 후반부가 의미가 없습니다.


@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 = subprocess.STDOUT 은 stderr-에서 filenotfound 오류를 얻지 않도록하기위한 것입니다. 이것은 보통 filenotfoundexception에서 잡힐 수 없습니다.

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

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


Since Python 3.5, subprocess.run() is recommended over subprocess.check_output():

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

Since Python 3.7, instead of the above, you can use capture_output=true parameter to capture stdout and stderr:

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

Also, you may want to use universal_newlines=True or its equivalent since Python 3.7 text=True to work with text instead of binary:

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

See subprocess.run() documentation for more information.

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

반응형