답변:
@milne의 답변은 효과가 있지만 subprocess.call()약간의 피드백을 제공합니다.
나는 subprocess.check_output()stdout에 인쇄 된 것을 분석 할 수 있도록 사용하는 것을 선호합니다 .
import subprocess
res = subprocess.check_output(["sudo", "apt", "update"])
for line in res.splitlines():
# process the output line by line
check_output 호출 된 명령을 0으로 종료하면 오류가 발생합니다.
함수에 키워드 인수를 bash지정 하지 않으면 (이것도 shell마찬가지이며 subprocess.call(), 보안 위험을 부과하므로 필요하지 않아야하지는 않습니다) 직접 호출합니다. 명령.
파이썬에서 많은 (다른) 명령 호출을 발견하면 plumbum 을보고 싶을 것 입니다. 이를 통해 (IMO)를 더 읽기 쉽게 할 수 있습니다.
from plumbum.cmd import sudo, apt, echo, cut
res = sudo[apt["update"]]()
chain = echo["hello"] | cut["-c", "2-"]
chain()
os.popen또는 os.system) 를 사용하는 것이 좋습니다 . 예 : res = os.popen('sudo apt update').read()? @Anthon
subprocess있지만 os.system및 os.popen이미 존재합니다. 이러한 PEP는 사소한 것이 아닙니다. 여러 사람이 당신이나 내가 할 것보다 훨씬 더 많은 생각을했습니다. 그리고 subprocess2003 년 이후, 다른 사람은 단지 거기에 여전히 이전 버전과의 호환성을 위해 있습니다 향상되었습니다. 당신은 빨간색이 os.system매뉴얼 페이지 : 서브 프로세스 모듈은 새로운 프로세스를 산란하고 결과를 검색하기위한보다 강력한 기능을 제공합니다; 이 기능을 사용하는 것보다 해당 모듈을 사용하는 것이 좋습니다.
sudo은 더 심각하게 만들 것입니다. 어쩌면 python-apt를 사용하는 것이 더 좋은 해결책 일 것입니다 (나는 직접 보지 않았습니다).
서브 프로세스 모듈은이 작업을 수행 할 수 있도록 설계되었습니다 :
import subprocess
subprocess.call(["sudo", "apt", "update"])
명령이 실패하면 스크립트를 종료 check_call()하려면 리턴 코드를 직접 구문 분석하는 대신 사용하는 것이 좋습니다.
subprocess.check_call(["sudo", "apt", "update"])
Traceback (most recent call last): File "/home/Dremor/test.py", line 3, in <module> subprocess.call('sudo', 'yum', 'update') File "/usr/lib64/python3.4/subprocess.py", line 537, in call with Popen(*popenargs, **kwargs) as p: File "/usr/lib64/python3.4/subprocess.py", line 767, in __init__ raise TypeError("bufsize must be an integer") TypeError: bufsize must be an integer (I 메인 OS로 페도라를 사용하고 나는이 yum을 사용하고 있습니다)
subprocess.call()차단하는 subprocess.Popen()것은 비 차단입니다 ..
또한 'os.popen'을 사용할 수 있습니다.
예:
import os
command = os.popen('ls -al')
print(command.read())
print(command.close())
산출:
total 16
drwxr-xr-x 2 root root 4096 ago 13 21:53 .
drwxr-xr-x 4 root root 4096 ago 13 01:50 ..
-rw-r--r-- 1 root root 1278 ago 13 21:12 bot.py
-rw-r--r-- 1 root root 77 ago 13 21:53 test.py
None
서브 프로세스 모듈 사용
import subprocess
command = 'sudo apt update'
subprocess.check_call(command.split())