Bagaimana cara memanggil skrip shell dari kode python?

211

Bagaimana cara memanggil skrip shell dari kode python?

Umesh K
sumber

Jawaban:

252

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.

Manoj Govindan
sumber
11
Catatan: lebih baik melewati subprocess.call () daftar daripada string (lihat perintah untuk Hugo24 di bawah untuk contoh dan alasan).
Jim Dennis
1
Tautan ke tutorial rusak.
Kshitij Saraogi
6
Ini memberi: OSError: [Errno 13] Izin ditolak. skrip saya tidak perlu dijalankan dengan sudo. @Manoj Govindan
alper
6
Dengan argumen: subprocess.call (['./ test.sh', 'param1', 'param2'])
Henry
2
@alper buka folder tempat Anda meletakkan skrip dan jalankan perintah chmod +x script.sh,. Catatan: script.sh adalah pengganti untuk skrip Anda, ganti sesuai.
Tom J Muthirenthi
106

Ada beberapa cara menggunakan os.popen()(usang) atau seluruh subprocessmodul, tetapi pendekatan ini

import os
os.system(command)

adalah salah satu yang termudah.

Michał Niklas
sumber
1
mengapa ini bukan jawaban yang paling banyak dipilih? Tidak harus mengimpor modul solusi yang lebih baik? Pasti ada kekurangan di sini?
boulder_ruby
6
Dengan 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.
Michał Niklas
1
Mengutip dari tautan itu:The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; *using that module is preferable to using this function.*
Maximilian
42

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
Franck Dernoncourt
sumber
Ini elegan.
caleb
20
import os
import sys

Dengan asumsi test.sh adalah skrip shell yang ingin Anda jalankan

os.system("sh test.sh")
Srayan Guhathakurta
sumber
15

Gunakan modul subproses seperti yang disebutkan di atas.

Saya menggunakannya seperti ini:

subprocess.call(["notepad"])
hugo24
sumber
13
Catatan: memanggil subproses dengan daftar lebih aman karena tidak perlu melewati string (berpotensi tidak bersih) melalui shell untuk parsing / interpretasi. Item pertama dalam daftar adalah yang dapat dieksekusi dan semua item lainnya akan diteruskan sebagai argumen.
Jim Dennis
13

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

lauralacarra
sumber
1
Catatan Jangan gunakan stdout = PIPE atau stderr = PIPE with subprocess.call. Proses anak akan memblokir jika menghasilkan output yang cukup ke pipa untuk mengisi buffer pipa OS karena pipa tidak dibaca.
4

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.

Ankit Singh
sumber
Apakah kamu tidak harus mengimpor sys juga?
ScottyBlades
Tidak, kamu tidak; coba buka cangkang Python dan jalankan cuplikan ini
Descartes
4

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"
Rishi Bansal
sumber
2

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:

  • Tingkat dokumentasi saat ini akan lebih komprehensif walaupun cukup.
  • Tidak seperti subproses, paket scriptine saat ini tidak diinstal secara default.
Akseli Palén
sumber
2

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'])
Kévin Sanchez Lacroix
sumber
1

Jika file skrip shell Anda tidak memiliki izin untuk melakukan, lakukan dengan cara berikut.

import subprocess
subprocess.run(['/bin/bash', './test.sh'])
thomasXu
sumber
-9

Silakan coba kode berikut:

Import Execute 

Execute("zbx_control.sh")
Manas
sumber