Jawaban:
Jawaban @ milne bekerja, tetapi subprocess.call()
memberi Anda sedikit umpan balik.
Saya lebih suka menggunakan subprocess.check_output()
sehingga Anda dapat menganalisis apa yang dicetak ke stdout:
import subprocess
res = subprocess.check_output(["sudo", "apt", "update"])
for line in res.splitlines():
# process the output line by line
check_output
melempar kesalahan saat keluar dari nol dari perintah yang dipanggil
Harap perhatikan bahwa ini tidak meminta bash
atau shell lain jika Anda tidak menentukan shell
argumen kata kunci untuk fungsi (hal yang sama berlaku untuk subprocess.call()
, dan Anda tidak boleh jika tidak perlu karena menimbulkan bahaya keamanan), itu langsung memanggil perintah.
Jika Anda menemukan diri Anda melakukan banyak pemanggilan perintah (berbeda) dari Python, Anda mungkin ingin melihat timah hitam . Dengan itu Anda dapat melakukan (IMO) lebih mudah dibaca:
from plumbum.cmd import sudo, apt, echo, cut
res = sudo[apt["update"]]()
chain = echo["hello"] | cut["-c", "2-"]
chain()
os.popen
atau os.system
), ex: res = os.popen('sudo apt update').read()
? @Anthon
subprocess
meskipun os.system
dan os.popen
sudah ada. PEP semacam itu tidak mudah untuk diterima. Beberapa orang lebih memikirkan hal itu daripada Anda atau saya akan pernah. Dan subprocess
telah meningkat sejak tahun 2003, yang lainnya masih ada untuk kompatibilitas. Sudahkah Anda merah os.system
halaman manual: Modul subproses menyediakan fasilitas yang lebih kuat untuk menelurkan proses baru dan mengambil hasilnya; menggunakan modul itu lebih baik daripada menggunakan fungsi ini.
sudo
hanya akan membuat itu lebih parah. Mungkin menggunakan python-apt adalah solusi yang lebih baik (saya belum melihatnya sendiri).
Mungkin Anda menggunakan bash sebagai program, dengan parameter -c untuk menjalankan perintah:
Contoh:
bashCommand = "sudo apt update"
output = subprocess.check_output(['bash','-c', bashCommand])
The subproses modul dirancang untuk melakukan hal ini:
import subprocess
subprocess.call(["sudo", "apt", "update"])
Jika Anda ingin skrip untuk dihentikan jika perintah gagal, Anda dapat mempertimbangkan untuk menggunakan sendiri check_call()
daripada menguraikan kode kembali:
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
(Saya menggunakan yum karena saya menggunakan Fedora sebagai OS utama)
subprocess.call()
memblokir sementara subprocess.Popen()
tidak memblokir ..
Anda juga dapat menggunakan 'os.popen'.
Contoh:
import os
command = os.popen('ls -al')
print(command.read())
print(command.close())
Keluaran:
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
gunakan modul subproses
import subprocess
command = 'sudo apt update'
subprocess.check_call(command.split())