
Subproses adalah modul Python bawaan yang dapat digunakan untuk membuat proses baru dan berinteraksi dengan aliran data input dan outputnya. Dalam istilah yang lebih sederhana, Anda dapat menggunakannya untuk menjalankan perintah shell dan menjalankan binari yang dapat dieksekusi yang biasanya tersebar di berbagai folder “bin” di sistem file Linux. Anda juga dapat menyediakan path lengkap ke biner yang dapat dieksekusi dan menggunakan sakelar command line apa pun yang terkait dengan biner. Artikel ini akan menjelaskan cara menggunakan modul subproses dan metode menjalankannya di aplikasi Python. Semua contoh kode dalam artikel diuji dengan Python 3.8.2 di Ubuntu 20.04.
Metode Subprocess.run
Metode Subprocess.run mengambil daftar argumen. Ketika metode dipanggil, ia menjalankan perintah dan menunggu proses selesai, mengembalikan objek “CompletedProcess” pada akhirnya. Objek “CompletedProcess” mengembalikan stdout, stderr, argumen asli yang digunakan saat memanggil metode, dan kode pengembalian. Stdout mengacu pada aliran data yang dihasilkan oleh perintah, sedangkan stderr mengacu pada error yang muncul selama eksekusi program. Setiap kode pengembalian bukan nol (kode keluar) akan berarti error dengan perintah yang dijalankan dalam metode subprocess.run.
Contoh 1: Isi Output dari File Teks Menggunakan Metode Subprocess.run
Perintah di bawah ini akan menampilkan konten file “data.txt”, dengan asumsi bahwa file tersebut berisi string “name=John”.
import subprocess
subprocess.run(["cat", "data.txt"])
Menjalankan kode di atas akan mengembalikan output berikut:
name=John
CompletedProcess(args=['cat', 'data.txt'], returncode=0)
Elemen pertama dari argumen daftar adalah nama perintah yang akan dieksekusi. Setiap elemen dalam daftar yang mengikuti elemen pertama dianggap sebagai opsi atau sakelar command line. Anda dapat menggunakan tanda hubung tunggal dan tanda hubung ganda, juga, untuk menentukan opsi. Misalnya, untuk membuat daftar file dan folder dalam direktori, kodenya adalah “subprocess.run([“ls”, “-l”]”. Dalam kebanyakan kasus ini, Anda dapat mempertimbangkan argumen yang dipisahkan oleh spasi dalam shell perintah sebagai elemen individu dalam daftar yang diberikan ke metode subprocess.run.
Contoh 2: Menekan Output dari Metode Subprocess.run
Untuk menekan output dari metode subprocess.run, Anda harus menyediakan “stdout=subprocess.DEVNULL” dan “stderr=subprocess.DEVNULL” sebagai argumen tambahan.
import subprocess
subprocess.run(["cat", "data.txt"], stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL)
Menjalankan kode di atas akan menghasilkan output berikut:
CompletedProcess(args=['cat', 'data.txt'], returncode=0)
Contoh 3: Menangkap Output dari Metode Subprocess.run
Untuk menangkap output dari metode subprocess.run, gunakan argumen tambahan bernama “capture_output=True”.
import subprocess
output = subprocess.run(["cat", "data.txt"], capture_output=True)
print (output)
Menjalankan kode di atas akan menghasilkan output berikut:
CompletedProcess(args=['cat', 'data.txt'], returncode=0,
stdout=b'name=Johnn', stderr=b'')
Anda dapat mengakses nilai stdout dan stderr secara individual dengan menggunakan metode “output.stdout” dan “output.stderr”. Output dihasilkan sebagai urutan byte. Untuk mendapatkan string sebagai output, gunakan metode “output.stdout.decode(“utf-8”)”. Anda juga dapat menyediakan “text=True” sebagai argumen tambahan untuk panggilan subprocess.run untuk mendapatkan output dalam format string. Untuk mendapatkan kode status keluar, Anda dapat menggunakan metode “output.returncode”.
Contoh 4: Naikkan Pengecualian pada Kegagalan Perintah yang Dieksekusi oleh Metode Subprocess.run
Untuk memunculkan pengecualian saat perintah keluar dengan status bukan nol, gunakan argumen “check=True”.
import subprocess
subprocess.run(["cat", "data.tx"], capture_output=True, text=True, check=True)
Menjalankan kode di atas akan menghasilkan output berikut:
raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['cat', 'data.tx']'
returned non-zero exit status 1.
Contoh 5: Berikan String ke Perintah yang Dieksekusi oleh Metode Subprocess.run
Anda dapat meneruskan string ke perintah yang akan dieksekusi oleh metode subprocess.run dengan menggunakan argumen “input=’string’”.
import subprocess
output = subprocess.run(["cat"], input="data.txt", capture_output=True,
text=True, check=True)
print (output)
Menjalankan kode di atas akan menghasilkan output berikut:
CompletedProcess(args=['cat'], returncode=0, stdout='data.txt', stderr='')
Seperti yang Anda lihat, kode di atas melewati “data.txt” sebagai string dan bukan sebagai objek file. Untuk meneruskan “data.txt” sebagai file, gunakan argumen “stdin”.
with open("data.txt") as f:
output = subprocess.run(["cat"], stdin=f, capture_output=True,
text=True, check=True)
print (output)
Menjalankan kode di atas akan menghasilkan output berikut:
CompletedProcess(args=['cat'], returncode=0, stdout='name=Johnn', stderr='')
Contoh 6: Jalankan Perintah Langsung di Shell Menggunakan Metode Subprocess.run
Dimungkinkan untuk menjalankan perintah langsung ke shell “sebagaimana adanya”, alih-alih menggunakan pemisahan string di perintah utama dan opsi yang mengikutinya. Untuk melakukan ini, Anda harus memberikan “shell=True” sebagai argumen tambahan. Namun ini, tidak disarankan oleh pengembang python karena menggunakan “shell=True” dapat menyebabkan masalah keamanan. Anda dapat membaca lebih lanjut tentang implikasi keamanan dari sini.
import subprocess
subprocess.run("cat 'data.txt’", shell=True)
Menjalankan kode di atas akan menghasilkan output berikut:
name=John
Kesimpulan
Metode subprocess.run di Python cukup kuat, karena memungkinkan Anda untuk menjalankan perintah shell di dalam python itu sendiri. < font ">Ini membantu dalam membatasi semua kode ke python itu sendiri tanpa perlu memiliki kode skrip shell tambahan di file terpisah. Akan tetapi, cukup sulit untuk menandai perintah shell dengan benar dalam daftar python. Anda dapat menggunakan metode “shlex.split()” untuk menandai perintah shell sederhana, tetapi dalam perintah yang panjang dan kompleks – terutama yang memiliki simbol pipa – shlex gagal membagi perintah dengan benar. Dalam kasus seperti itu, debugging bisa menjadi masalah yang rumit. Anda dapat menggunakan argumen “shell=True” untuk menghindari hal ini, tetapi ada masalah keamanan tertentu yang terkait dengan tindakan ini.