답변:
@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는 사소한 것이 아닙니다. 여러 사람이 당신이나 내가 할 것보다 훨씬 더 많은 생각을했습니다. 그리고 subprocess
2003 년 이후, 다른 사람은 단지 거기에 여전히 이전 버전과의 호환성을 위해 있습니다 향상되었습니다. 당신은 빨간색이 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())