파이썬에서 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
'IT Share you' 카테고리의 다른 글
Composer로 jQuery를 설치하는 방법은 무엇입니까? (0) | 2020.12.12 |
---|---|
localStorage가 가득 차면 어떻게됩니까? (0) | 2020.12.12 |
파이썬에서 클래스에 대한 클래스 메서드를 동적으로 만드는 방법 (0) | 2020.12.12 |
github에서 폴더 별 readme 파일을 만드는 방법이 있습니까? (0) | 2020.12.12 |
RestTemplate 스레드는 안전합니까? (0) | 2020.12.12 |