Yanıtlar:
Altişlem modülü size yardımcı olacaktır.
Açıkça önemsiz örnek:
>>> import subprocess
>>> subprocess.call(['./test.sh']) # Thanks @Jim Dennis for suggesting the []
0
>>>
Burada test.shbasit bir kabuk betiği ve 0bu çalışma için dönüş değeri.
chmod +x script.sh. Not: script.sh betiğiniz için bir yer tutucudur, uygun şekilde değiştirin.
Modülü os.popen()veya tüm subprocessmodülü kullanmanın bazı yolları vardır , ancak bu yaklaşım
import os
os.system(command)
en kolay olanlardan biridir.
subprocessgiriş / çıkış / hata borularını yönetebilirsiniz. Birçok argümanınız olduğunda da daha iyi olur - basit os.command()karakter subprocessargümanları ile birlikte, özel karakterlerden kaçan tüm komut satırını oluşturmanız gerekir . Ancak basit görevler için os.command() yeterli olabilir.
The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; *using that module is preferable to using this function.*
Kabuk betiğinize bazı parametreler iletmek isterseniz, shlex.split () yöntemini kullanabilirsiniz :
import subprocess
import shlex
subprocess.call(shlex.split('./test.sh param1 param2'))
ile test.shaynı klasörde:
#!/bin/sh
echo $1
echo $2
exit 0
Çıktılar:
$ python test.py
param1
param2
import os
import sys
Test.sh komutunun yürütmek istediğiniz kabuk betiği olduğunu varsayarsak
os.system("sh test.sh")
Yukarıda belirtilen alt işlem modülünü kullanın.
Ben böyle kullanın:
subprocess.call(["notepad"])
Python 3.5 çalıştırıyorum ve subprocess.call (['./ test.sh']) benim için çalışmıyor.
Size üç çözüm veriyorum, çıktı ile ne yapmak istediğinize bağlı.
1 - çağrı komut dosyası. Terminalinizde çıktı göreceksiniz. çıktı bir sayıdır.
import subprocess
output = subprocess.call(['test.sh'])
2 - çağrı ve yürütme ve hata dize dökümü. Yazdırmadan terminalinizde yürütme görmüyorsunuz (stdout). Shell = Popen'deki argüman benim için işe yaramıyor.
import subprocess
from subprocess import Popen, PIPE
session = subprocess.Popen(['test.sh'], stdout=PIPE, stderr=PIPE)
stdout, stderr = session.communicate()
if stderr:
raise Exception("Error "+str(stderr))
3 - komut dosyasını çağırın ve temp.txt dosyasının echo komutlarını temp_file dosyasına dökün
import subprocess
temp_file = open("temp.txt",'w')
subprocess.call([executable], stdout=temp_file)
with open("temp.txt",'r') as file:
output = file.read()
print(output)
Doküman alt işlemine bir göz atmayı unutmayın
Alt süreç modülü, alt süreçleri başlatmak için iyi bir modüldür. Kabuk komutlarını şu şekilde çağırmak için kullanabilirsiniz:
subprocess.call(["ls","-l"]);
#basic syntax
#subprocess.call(args, *)
Belgelerini burada görebilirsiniz .
Komut dosyanızı bazı .sh dosyalarında veya uzun bir dizede yazdıysanız, os.system modülünü kullanabilirsiniz. Oldukça basit ve aramak kolaydır:
import os
os.system("your command here")
# or
os.system('sh file.sh')
Bu komut, komut dosyasını bir kez çalıştıracak, tamamlanacak ve çıkana kadar engelleyecektir.
Komut dosyasının birden fazla bağımsız değişkeni olması durumunda
#!/usr/bin/python
import subprocess
output = subprocess.call(["./test.sh","xyz","1234"])
print output
Çıktı durum kodunu verecektir. Komut dosyası başarıyla çalışırsa, aksi takdirde sıfır dışında bir tam sayı verir.
podname=xyz serial=1234
0
Test.sh kabuk betiği aşağıdadır.
#!/bin/bash
podname=$1
serial=$2
echo "podname=$podname serial=$serial"
Alt işlem iyidir, ancak bazı insanlar scriptini daha iyi sevebilir . Komut dosyası, shell.call (args) , path.rename (yeni_adı) ve path.move (src, dst) gibi daha üst düzey yöntemler kümesine sahiptir . Scriptine, alt süreç ve diğerlerine dayanır .
Scripinin iki dezavantajı:
Bu eski bir soru olduğunu biliyorum ama son zamanlarda bu tökezledi ve python 3.5 beri değişti gibi Altişlem API beri beni yanlış yönlendirdi .
Harici komut dosyalarını yürütmenin yeni yolu run, args tarafından açıklanan komutu çalıştıran işlevdir. Komutun tamamlanmasını bekler, ardından bir CompletedProcess örneği döndürür.
import subprocess
subprocess.run(['./test.sh'])