bir python betiğinde bash komutu nasıl çalıştırılır


Yanıtlar:


18

@ 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 bashiçin shellanahtar 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.popenVeya os.system) kullanılması önerilir res = os.popen('sudo apt update').read()mi , örn .: ? @Anthon
alper

1
Okuma 0324 @alper python.org/dev/peps/pep-0324 . Yani yapmak için gerekçesini açıklıyor subprocessolsa os.systemve os.popenzaten vardı. Bu tür KEP'lerin kabul edilmesi önemsiz değildir. Birkaç kişi bunu sizin ya da benden daha fazla düşündü. Ve subprocess2003 yılından bu yana gelişti, diğerleri sadece geriye dönük uyumluluk için hala orada. os.systemKı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.
Anthon

1
@alper Evet yapabilirsin. Belirttiğim gibi, potansiyel bir güvenlik tehlikesi, bu yüzden bunun neden önerildiğini bilmiyorum. Ve çağırmak sudosadece bunu daha ciddi hale getirecektir. Belki python-apt kullanmak daha iyi bir çözümdür (kendime bakmadım).
Anthon

1
@alper bu durumda plumbum'a ciddi bir göz atın , bununla hızlanmaya değer.
Anthon

1
@alper Python3 üzerindeyseniz, bunu yapmanız gerekir, Python2'de bunu yapmazsınız. Lütfen buradaki yorumu sohbet sistemi olarak kullanmayın. Bir sorunuz varsa bu şekilde gönderin.
Anthon

8

Komutları yürütmek için -c parametresi ile bash'ı bir program olarak kullanabilirsiniz:

Misal:

bashCommand = "sudo apt update"
output = subprocess.check_output(['bash','-c', bashCommand])

7

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"])

bu bana aşağıdaki izlemeyi verdi: 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)
16.07'de Dremor

3
Köşeli parantezleri unuttun
Milind Dumbare

1
Ayrıca subprocess.call()bloke ederken engelleme olmadığını unutmayın subprocess.Popen()..
heemayl

"Engelleme" ile ne demek istiyorsun? @heemayl
alper

2

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

0

alt işlem modülünü kullan

import subprocess
command = 'sudo apt update'
subprocess.check_call(command.split())

neden kullandığımda bir hata alıyorum
aquagremlin

subprocess.check_call (["sudo", "apt", "update"])
aquagremlin

CalledProcessError Traceback (son arama sonuncusu) <module> () ----> 1 subprocess.check_call (["sudo", "apt", "güncelleme"]) / usr / cm_ Yoktur: 189 cmd = popenargs [0] -> 190 yükseltilen Call_ProallError (retcode, cmd) 191 dönüş 0 192 CalledProcessError: Command '[' sudo ',' apt ',' update ']' sıfır olmayan çıkış durumu 1 döndürdü
aquagremlin

bu hata sadece bir jupyter not defterinde çalıştırdığımda olur
aquagremlin

belki bu yeni bir soruya başlayacağım çünkü bu ot
aquagremlin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.