하위 프로세스를 사용하는 방법.파이썬에서 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=true
stdout 및 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
'sourcecode' 카테고리의 다른 글
ng-class를 사용하여 다중 클래스 추가 (0) | 2023.05.23 |
---|---|
전원 쿼리:그룹화된 값을 연결하려면 어떻게 해야 합니까? (0) | 2023.05.23 |
pathlib가 있는 새 폴더를 만들고 파일을 해당 폴더에 씁니다. (0) | 2023.05.23 |
Stuff 및 'For Xml Path'는 SQL Server에서 어떻게 작동합니까? (0) | 2023.05.23 |
Git에서 단계별 변경 사항만 저장하는 방법은 무엇입니까? (0) | 2023.05.23 |