Câu trả lời:
Câu trả lời của @ milne hoạt động, nhưng subprocess.call()
cung cấp cho bạn ít phản hồi.
Tôi thích sử dụng subprocess.check_output()
để bạn có thể phân tích những gì đã được in ra thiết bị xuất chuẩn:
import subprocess
res = subprocess.check_output(["sudo", "apt", "update"])
for line in res.splitlines():
# process the output line by line
check_output
đưa ra một lỗi trên lối thoát bằng không của lệnh được gọi
Xin lưu ý rằng điều này không gọi bash
hoặc shell khác nếu bạn không chỉ định shell
đối số từ khóa cho hàm (điều này cũng đúng subprocess.call()
và bạn không nên nếu không cần thiết vì nó gây nguy hiểm bảo mật), nó trực tiếp gọi chỉ huy.
Nếu bạn thấy mình đang thực hiện rất nhiều lệnh (khác nhau) từ Python, bạn có thể muốn xem xét plumbum . Với điều đó, bạn có thể làm (IMO) dễ đọc hơn:
from plumbum.cmd import sudo, apt, echo, cut
res = sudo[apt["update"]]()
chain = echo["hello"] | cut["-c", "2-"]
chain()
os.popen
hoặc os.system
), ví dụ : res = os.popen('sudo apt update').read()
? @Anthon
subprocess
mặc dù os.system
và os.popen
đã tồn tại. PEP như vậy là không tầm thường để được chấp nhận. Một số người đã suy nghĩ nhiều về điều đó hơn bạn hoặc tôi sẽ làm. Và subprocess
đã được cải thiện từ năm 2003, những cái khác vẫn còn đó để tương thích ngược. Bạn có tô đỏ os.system
trang thủ công: Mô-đun quy trình con cung cấp các phương tiện mạnh hơn để sinh ra các quy trình mới và lấy kết quả của chúng; sử dụng mô-đun đó là tốt hơn để sử dụng chức năng này.
sudo
sẽ chỉ làm cho điều đó nghiêm trọng hơn. Có lẽ sử dụng python-apt là một giải pháp tốt hơn (bản thân tôi chưa xem xét điều đó).
Các tiến trình con mô-đun được thiết kế để làm việc này:
import subprocess
subprocess.call(["sudo", "apt", "update"])
Nếu bạn muốn tập lệnh chấm dứt nếu lệnh thất bại, bạn có thể cân nhắc sử dụng check_call()
thay vì tự phân tích mã trả về:
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
(Tôi đang sử dụng yum vì tôi đang sử dụng Fedora làm hệ điều hành chính)
subprocess.call()
việc chặn trong khi subprocess.Popen()
không chặn ..
Ngoài ra, bạn có thể sử dụng 'os.popen'.
Thí dụ:
import os
command = os.popen('ls -al')
print(command.read())
print(command.close())
Đầu ra:
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
sử dụng mô đun quy trình con
import subprocess
command = 'sudo apt update'
subprocess.check_call(command.split())