Saya punya masalah dengan kode berikut:
callBash.py:
import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"
sleep.sh:
sleep 10
Saya ingin "akhir" dicetak setelah 10 detik. (Saya tahu bahwa ini adalah contoh yang bodoh, saya bisa saja tidur dalam python, tetapi file sleep.sh sederhana ini hanya sebagai tes)
Jawaban:
Membuat sleep.sh dapat dieksekusi dan menambahkan
shell=True
ke daftar parameter (seperti yang disarankan dalam jawaban sebelumnya) berfungsi dengan baik. Bergantung pada jalur pencarian, Anda mungkin juga perlu menambahkan./
atau jalur lain yang sesuai. (Yaitu, ganti"sleep.sh"
ke"./sleep.sh"
.)The
shell=True
parameter tidak diperlukan (di bawah sistem POSIX seperti Linux) jika baris pertama script bash adalah jalan untuk shell; misalnya#!/bin/bash
,.sumber
Jika
sleep.sh
memiliki shebang#!/bin/sh
dan memiliki izin file yang sesuai - jalankanchmod u+rx sleep.sh
untuk memastikan dan sudah masuk$PATH
maka kode Anda harus berfungsi sebagaimana mestinya:Jika skrip tidak ada di PATH, tentukan jalur lengkapnya, misalnya, jika ada di direktori kerja saat ini:
Jika skrip tidak memiliki shebang maka Anda perlu menentukan
shell=True
:Jika skrip tidak memiliki izin yang dapat dieksekusi dan Anda tidak dapat mengubahnya, misalnya dengan menjalankannya,
os.chmod('sleep.sh', 0o755)
Anda dapat membaca skrip sebagai file teks dan meneruskan string kesubprocess
modul sebagai gantinya:sumber
Sebenarnya, Anda hanya perlu menambahkan
shell=True
argumen:Tapi waspadalah -
sumber
sumber
sleep.sh
tidak ada diPATH
. Dan jika sudah di jalur dan memiliki shebang yang benar maka Anda tidak perlushell=True
. Lihat jawaban sayaJika seseorang mencari memanggil skrip dengan argumen
Ingatlah untuk mengonversi args menjadi string sebelum meneruskan, menggunakan str (arg).
Ini dapat digunakan untuk meneruskan argumen sebanyak yang diinginkan:
sumber
Pastikan itu
sleep.sh
memiliki izin eksekusi, dan jalankan denganshell=True
:sumber
#!bin/bash
hilang/
.#!/bin/bash
berfungsi seperti yang saya catat dalam sebuah jawaban.Jika chmod tidak berfungsi maka Anda juga mencoba
uji oleh saya terima kasih
sumber
os.system
dokumentasi khusus menganjurkan untuk menghindari itu mendukungsubprocess
(hari ini,subprocess.run()
). Jika Anda tidak bisasubprocess
bekerja, kemungkinan besar Anda juga akan kesulitanos.system()
.Menambahkan jawaban karena saya diarahkan ke sini setelah menanyakan cara menjalankan skrip bash dari python. Anda menerima kesalahan
OSError: [Errno 2] file not found
jika skrip Anda memasukkan parameter. Katakanlah misalnya skrip Anda mengambil parameter waktu tidur:subprocess.call("sleep.sh 10")
tidak akan berfungsi, Anda harus meneruskannya sebagai array:subprocess.call(["sleep.sh", 10])
sumber
shell=True
tapi ya, biasanya menghindarinya adalah permainan terbaik Anda.