Cara Menjalankan Perintah Shell dengan Python Menggunakan Metode Jalankan Subproses

How Execute Shell Commands Python Using Subprocess Run Method



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 baris perintah 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 kesalahan yang muncul selama eksekusi program. Setiap kode pengembalian bukan nol (kode keluar) akan berarti kesalahan 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 file tersebut berisi string name=John.



impor subproses
subproses.Lari(['kucing', 'data.txt'])

Menjalankan kode di atas akan mengembalikan output berikut:



nama=John
Proses Selesai(argumen=['kucing', 'data.txt'],kode kembali=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 baris perintah. 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 sebagian besar kasus ini, Anda dapat mempertimbangkan argumen yang dipisahkan spasi dalam perintah shell sebagai elemen individual di 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.

impor subproses

subproses.Lari(['kucing', 'data.txt'],stdout=subproses.DEVNULL,
stderr=subproses.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.

impor subproses
keluaran= subproses.Lari(['kucing', 'data.txt'],tangkap_keluaran=benar)
mencetak (keluaran)

Menjalankan kode di atas akan menghasilkan output berikut:

Proses Selesai(argumen=['kucing', 'data.txt'],kode kembali=0,
stdout=B'nama=John ',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 ke 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.

impor subproses
subproses.Lari(['kucing', 'data.tx'],tangkap_keluaran=benar,teks=benar,memeriksa=benar)

Menjalankan kode di atas akan menghasilkan output berikut:

tingkatkan CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Perintah '['cat', 'data.tx']'
mengembalikan status keluar bukan nol 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'.

impor subproses
keluaran= subproses.Lari(['kucing'], memasukkan='data.txt',tangkap_keluaran=benar,
teks=benar,memeriksa=benar)
mencetak (keluaran)

Menjalankan kode di atas akan menghasilkan output berikut:

CompletedProcess(args=['cat'], returncode=0, stdout='data.txt', stderr='')

Seperti yang Anda lihat, kode di atas meneruskan data.txt sebagai string dan bukan sebagai objek file. Untuk meneruskan data.txt sebagai file, gunakan argumen stdin.

dengan membuka('data.txt') sebagaiF:
keluaran= subproses.Lari(['kucing'],stdin=F,tangkap_keluaran=benar,
teks=benar,memeriksa=benar)
mencetak (keluaran)

Menjalankan kode di atas akan menghasilkan output berikut:

CompletedProcess(args=['cat'], returncode=0, stdout='name=John ', stderr='')

Contoh 6: Jalankan Perintah Langsung di Shell Menggunakan Metode Subprocess.run

Dimungkinkan untuk menjalankan perintah langsung ke shell apa adanya, daripada 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 di sini .

impor subproses
subproses.Lari('cat 'data.txt'',kerang=benar)

Menjalankan kode di atas akan menghasilkan output berikut:

nama=John

Kesimpulan

Metode subprocess.run di Python cukup kuat, karena memungkinkan Anda untuk menjalankan perintah shell di dalam python itu sendiri. 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.