Cara Melaksanakan Perintah Shell di Python Menggunakan Kaedah Subproses

How Execute Shell Commands Python Using Subprocess Run Method



Subproses adalah modul Python terbina dalam yang dapat digunakan untuk membuat proses baru dan berinteraksi dengan aliran data input dan output mereka. Dalam istilah yang lebih mudah, anda boleh menggunakannya untuk menjalankan perintah shell dan menjalankan binari yang boleh dilaksanakan yang biasanya tersebar di pelbagai folder bin di seluruh sistem fail Linux. Anda juga boleh menyediakan jalan penuh ke binari yang boleh dilaksanakan dan menggunakan suis baris perintah yang berkaitan dengan binari. Artikel ini akan menerangkan cara menggunakan modul subproses dan kaedah lariannya dalam aplikasi Python. Semua sampel kod dalam artikel diuji dengan Python 3.8.2 di Ubuntu 20.04.

Kaedah Subprocess.run

Kaedah Subprocess.run mengambil senarai argumen. Apabila kaedah dipanggil, ia melaksanakan perintah dan menunggu proses selesai, mengembalikan objek CompletedProcess pada akhirnya. Objek CompletedProcess mengembalikan stdout, stderr, argumen asal yang digunakan semasa memanggil kaedah, dan kod pengembalian. Stdout merujuk kepada aliran data yang dihasilkan oleh perintah, sementara stderr merujuk pada kesalahan yang timbul semasa pelaksanaan program. Mana-mana kod pengembalian bukan sifar (kod keluar) bermaksud ralat dengan perintah yang dilaksanakan dalam kaedah subprocess.run.







Contoh 1: Isi Kandungan Fail Teks Menggunakan Kaedah Subprocess.run

Perintah di bawah akan mengeluarkan kandungan fail data.txt, dengan asumsi ia mengandungi nama = rentetan John.



mengimport subproses
subproses.lari(['kucing', 'data.txt'])

Menjalankan kod di atas akan mengembalikan output berikut:



nama=John
Proses Selesai(berhujah=['kucing', 'data.txt'],kod pemulangan=0)

Elemen pertama argumen senarai adalah nama perintah yang akan dilaksanakan. Mana-mana elemen dalam senarai yang mengikuti elemen pertama dianggap sebagai pilihan baris atau suis perintah. Anda juga boleh menggunakan tanda hubung tunggal dan tanda hubung ganda untuk menentukan pilihan. Sebagai contoh, untuk menyenaraikan fail dan folder dalam direktori, kodnya akan menjadi subprocess.run ([ls, -l]. Dalam kebanyakan kes ini, anda boleh mempertimbangkan sebarang argumen yang dipisahkan ruang dalam perintah shell sebagai elemen individu dalam senarai yang dibekalkan kepada kaedah subprocess.run.





Contoh 2: Menindas Keluaran Kaedah Subprocess.run

Untuk menekan output dari kaedah subprocess.run, anda perlu membekalkan stdout = subprocess.DEVNULL dan stderr = subprocess.DEVNULL sebagai argumen tambahan.

mengimport subproses

subproses.lari(['kucing', 'data.txt'],stdout=subproses.MEMBANGUN,
stderr=subproses.MEMBANGUN)

Menjalankan kod di atas akan menghasilkan output berikut:



SelesaiProses (args = ['cat', 'data.txt'], returncode = 0)

Contoh 3: Hasil tangkapan Kaedah Subprocess.run

Untuk menangkap output kaedah subprocess.run, gunakan argumen tambahan bernama capture_output = True.

mengimport subproses
pengeluaran= subproses.lari(['kucing', 'data.txt'],tangkapan_keluaran=Betul)
mencetak (pengeluaran)

Menjalankan kod di atas akan menghasilkan output berikut:

Proses Selesai(berhujah=['kucing', 'data.txt'],kod pemulangan=0,
stdout=b'nama = John n',stderr=b'')

Anda boleh mengakses nilai stdout dan stderr secara individu dengan menggunakan kaedah output.stdout dan output.stderr. Keluaran dihasilkan sebagai urutan bait. Untuk mendapatkan rentetan sebagai output, gunakan kaedah output.stdout.decode (utf-8). Anda juga dapat memberikan teks = Benar sebagai argumen tambahan kepada panggilan subprocess.run untuk mendapatkan output dalam format rentetan. Untuk mendapatkan kod status keluar, anda boleh menggunakan kaedah output.returncode.

Contoh 4: Tingkatkan Pengecualian atas Kegagalan Perintah yang Dilaksanakan dengan Kaedah Subprocess.run

Untuk meningkatkan pengecualian ketika perintah keluar dengan status bukan sifar, gunakan tanda centang = Benar.

mengimport subproses
subproses.lari(['kucing', 'data.tx'],tangkapan_keluaran=Betul,teks=Betul,periksa=Betul)

Menjalankan kod di atas akan menghasilkan output berikut:

menaikkan CalledProcessError (retcode, process.args,
subprocess.CalledProcessError: Perintah '[' cat ',' data.tx ']'
mengembalikan status keluar bukan sifar 1.

Contoh 5: Serahkan String to Command yang Dilaksanakan dengan Kaedah Subprocess.run

Anda boleh meneruskan rentetan ke perintah yang akan dilaksanakan dengan kaedah subprocess.run dengan menggunakan argumen input = 'string'.

mengimport subproses
pengeluaran= subproses.lari(['kucing'], input='data.txt',tangkapan_keluaran=Betul,
teks=Betul,periksa=Betul)
mencetak (pengeluaran)

Menjalankan kod di atas akan menghasilkan output berikut:

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

Seperti yang anda lihat, kod di atas menyampaikan data.txt sebagai rentetan dan bukan sebagai objek fail. Untuk menyampaikan data.txt sebagai fail, gunakan argumen stdin.

dengan buka('data.txt') sebagaif:
pengeluaran= subproses.lari(['kucing'],stdin=f,tangkapan_keluaran=Betul,
teks=Betul,periksa=Betul)
mencetak (pengeluaran)

Menjalankan kod di atas akan menghasilkan output berikut:

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

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

Adalah mungkin untuk menjalankan perintah terus ke dalam shell sebagaimana adanya, daripada menggunakan rentetan yang terbelah dalam perintah utama dan pilihan yang mengikutinya. Untuk melakukan ini, anda mesti melewati shell = True sebagai argumen tambahan. Namun demikian, tidak digalakkan oleh pemaju python kerana menggunakan shell = True boleh menyebabkan masalah keselamatan. Anda boleh membaca lebih lanjut mengenai implikasi keselamatan dari di sini .

mengimport subproses
subproses.lari('cat' data.txt '',tempurung=Betul)

Menjalankan kod di atas akan menghasilkan output berikut:

nama = John

Kesimpulannya

Kaedah subprocess.run di Python cukup hebat, kerana ia membolehkan anda menjalankan perintah shell dalam python itu sendiri. Ini membantu mengehadkan semua kod ke python itu sendiri tanpa perlu mempunyai kod skrip shell tambahan dalam fail yang berasingan. Akan tetapi, agak sukar untuk menandakan perintah shell dengan betul dalam senarai python. Anda boleh menggunakan kaedah shlex.split () untuk menandakan perintah shell sederhana, tetapi dalam perintah yang panjang dan kompleks - terutama yang mempunyai simbol paip - shlex gagal untuk membelah perintah dengan betul. Dalam kes seperti itu, penyahpepijatan boleh menjadi masalah yang sukar. Anda boleh menggunakan shell = True argumen untuk mengelakkan ini, tetapi ada masalah keselamatan tertentu yang berkaitan dengan tindakan ini.