Jawaban:
The subproses modul akan membantu Anda keluar.
Contoh sepele yang mencolok:
>>> import subprocess
>>> subprocess.call(['./test.sh']) # Thanks @Jim Dennis for suggesting the []
0
>>>
Di mana test.shskrip shell sederhana dan 0merupakan nilai balik untuk proses ini.
chmod +x script.sh,. Catatan: script.sh adalah pengganti untuk skrip Anda, ganti sesuai.
Ada beberapa cara menggunakan os.popen()(usang) atau seluruh subprocessmodul, tetapi pendekatan ini
import os
os.system(command)
adalah salah satu yang termudah.
subprocessAnda dapat mengelola pipa input / output / kesalahan. Ini juga lebih baik ketika Anda memiliki banyak argumen - dengan os.command()Anda harus membuat seluruh baris perintah dengan melarikan diri karakter khusus, dengan subprocessada daftar argumen sederhana. Tetapi untuk tugas os.command() - tugas sederhana mungkin cukup.
The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; *using that module is preferable to using this function.*
Jika Anda ingin mengirimkan beberapa parameter ke skrip shell, Anda dapat menggunakan metode shlex.split () :
import subprocess
import shlex
subprocess.call(shlex.split('./test.sh param1 param2'))
dengan test.shdi folder yang sama:
#!/bin/sh
echo $1
echo $2
exit 0
Output:
$ python test.py
param1
param2
import os
import sys
Dengan asumsi test.sh adalah skrip shell yang ingin Anda jalankan
os.system("sh test.sh")
Gunakan modul subproses seperti yang disebutkan di atas.
Saya menggunakannya seperti ini:
subprocess.call(["notepad"])
Saya menjalankan python 3.5 dan subprocess.call (['./ test.sh']) tidak berfungsi untuk saya.
Saya memberi Anda tiga solusi tergantung pada apa yang ingin Anda lakukan dengan output.
1 - skrip panggilan. Anda akan melihat output di terminal Anda. output adalah angka.
import subprocess
output = subprocess.call(['test.sh'])
2 - panggilan dan eksekusi dump dan kesalahan ke dalam string. Anda tidak melihat eksekusi di terminal Anda kecuali jika Anda mencetak (stdout). Shell = Benar sebagai argumen di Popen tidak berfungsi untuk saya.
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 - panggil skrip dan buang perintah echo dari temp.txt di temp_file
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)
Jangan lupa untuk melihat proses dokumen
Modul subproses adalah modul yang baik untuk meluncurkan subproses. Anda dapat menggunakannya untuk memanggil perintah shell karena ini:
subprocess.call(["ls","-l"]);
#basic syntax
#subprocess.call(args, *)
Anda dapat melihat dokumentasinya di sini.
Jika skrip Anda ditulis dalam beberapa file .sh atau string yang panjang, maka Anda dapat menggunakan modul sistem os.system. Ini cukup sederhana dan mudah dipanggil:
import os
os.system("your command here")
# or
os.system('sh file.sh')
Perintah ini akan menjalankan skrip sekali, untuk menyelesaikan, dan memblokir sampai keluar.
Jika skrip memiliki beberapa argumen
#!/usr/bin/python
import subprocess
output = subprocess.call(["./test.sh","xyz","1234"])
print output
Output akan memberikan kode status. Jika skrip berjalan dengan sukses maka akan menghasilkan 0 bilangan bulat jika tidak nol
podname=xyz serial=1234
0
Di bawah ini adalah skrip shell test.sh.
#!/bin/bash
podname=$1
serial=$2
echo "podname=$podname serial=$serial"
Subproses bagus tetapi beberapa orang mungkin lebih suka scriptine . Scriptine memiliki lebih banyak set metode tingkat tinggi seperti shell.call (args) , path.rename (new_name) dan path.move (src, dst) . Scriptine didasarkan pada subproses dan lainnya.
Dua kelemahan scriptine:
Saya tahu ini adalah pertanyaan lama, tetapi saya menemukan ini baru-baru ini dan akhirnya salah menilaiku karena Subprocess API diubah sejak python 3.5.
Cara baru untuk menjalankan skrip eksternal adalah dengan runfungsi, yang menjalankan perintah yang dijelaskan oleh args. Menunggu perintah selesai, lalu mengembalikan contoh CompletedProcess.
import subprocess
subprocess.run(['./test.sh'])