Yanıtlar:
@ milne'nin cevabı işe yarıyor, ancak subprocess.call()
size çok az geri bildirim veriyor.
subprocess.check_output()
Stdout'a yazdırılanları analiz edebilmeniz için kullanmayı tercih ederim :
import subprocess
res = subprocess.check_output(["sudo", "apt", "update"])
for line in res.splitlines():
# process the output line by line
check_output
çağrılan komutun sıfır çıkışında bir hata atar
İşlev bash
için shell
anahtar kelime bağımsız değişkenini belirtmezseniz (bunun aynı şey için geçerli olduğunu subprocess.call()
ve bir güvenlik tehlikesi oluşturduğu için gerekli değilse gerekmemesi gerektiğini), bunun çağrılmadığını veya başka bir kabuk olduğunu lütfen unutmayın . komut.
Kendinizi Python'dan çok sayıda (farklı) komut çağrısı yaptığında bulursanız , plumbum'a bakmak isteyebilirsiniz . Bununla (IMO) daha okunabilir yapabilirsiniz:
from plumbum.cmd import sudo, apt, echo, cut
res = sudo[apt["update"]]()
chain = echo["hello"] | cut["-c", "2-"]
chain()
os.popen
Veya os.system
) kullanılması önerilir res = os.popen('sudo apt update').read()
mi , örn .: ? @Anthon
subprocess
olsa os.system
ve os.popen
zaten vardı. Bu tür KEP'lerin kabul edilmesi önemsiz değildir. Birkaç kişi bunu sizin ya da benden daha fazla düşündü. Ve subprocess
2003 yılından bu yana gelişti, diğerleri sadece geriye dönük uyumluluk için hala orada. os.system
Kılavuz sayfasını kırmızılaştırdınız mı : Alt işlem modülü, yeni süreçlerin ortaya çıkması ve sonuçlarının alınması için daha güçlü özellikler sağlar; bu modülü kullanmak bu işlevi kullanmak için tercih edilir.
sudo
sadece bunu daha ciddi hale getirecektir. Belki python-apt kullanmak daha iyi bir çözümdür (kendime bakmadım).
Altişlem modülü Bunu yapmak için tasarlanmıştır:
import subprocess
subprocess.call(["sudo", "apt", "update"])
Komutun başarısız olması durumunda komut dosyasının sonlanmasını isterseniz check_call()
, dönüş kodunu kendiniz ayrıştırmak yerine kullanmayı düşünebilirsiniz :
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
( Fedora'yı ana işletim sistemi olarak kullandığımda yum kullanıyorum)
subprocess.call()
bloke ederken engelleme olmadığını unutmayın subprocess.Popen()
..
Ayrıca 'os.popen' kullanabilirsiniz.
Misal:
import os
command = os.popen('ls -al')
print(command.read())
print(command.close())
Çıktı:
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
alt işlem modülünü kullan
import subprocess
command = 'sudo apt update'
subprocess.check_call(command.split())