Python

Cara Melaksanakan Perintah Shell di Python Menggunakan Kaedah Subproses

Cara Melaksanakan Perintah Shell di Python Menggunakan Kaedah Subproses
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 dapat menggunakannya untuk menjalankan perintah shell dan menjalankan binari yang dapat dieksekusi yang biasanya tersebar di berbagai 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 kaedahnya dalam aplikasi Python. Semua sampel kod dalam artikel diuji dengan Python 3.8.2 di Ubuntu 20.04.

Subproses.jalankan Kaedah

Subproses.kaedah run mengambil senarai hujah. Apabila kaedah dipanggil, ia melaksanakan perintah dan menunggu proses selesai, mengembalikan objek "CompletedProcess" pada akhirnya. Objek "SelesaiProses" 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 kepada segala kesalahan yang timbul semasa pelaksanaan program. Mana-mana kod pengembalian bukan sifar (kod keluar) bermaksud ralat dengan perintah yang dijalankan dalam subproses.kaedah larian.

Contoh 1: Isi Kandungan Fail Teks Menggunakan Subproses.jalankan Kaedah

Perintah di bawah akan mengeluarkan kandungan “data.fail txt, dengan anggapan ia mengandungi rentetan "name = John".

subproses import
subproses.jalankan (["kucing", "data.txt "])

Menjalankan kod di atas akan mengembalikan output berikut:

nama = John
SelesaiProses (args = ['cat', 'data.txt '], kod pengembalian = 0)

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

Contoh 2: Menindas Keluaran Subproses.jalankan Kaedah

Untuk menekan output subproses.kaedah jalankan, anda perlu membekalkan “stdout = subproses.MEMBANGUN ”dan“ stderr = subproses.DEVNULL ”sebagai hujah tambahan.

subproses import
subproses.jalankan (["kucing", "data.txt "], stdout = subproses.MEMBANGUN,
stderr = subproses.MEMBANGUN)

Menjalankan kod di atas akan menghasilkan output berikut:

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

Contoh 3: Tangkap Hasil dari Subproses.jalankan Kaedah

Untuk menangkap output subproses.jalankan kaedah, gunakan argumen tambahan bernama "capture_output = True".

subproses import
output = subproses.jalankan (["kucing", "data.txt "], capture_output = Benar)
cetak (keluaran)

Menjalankan kod di atas akan menghasilkan output berikut:

SelesaiProses (args = ['cat', 'data.txt '], kod pengembalian = 0,
stdout = b'name = John \ n ', stderr = b ")

Anda secara individu boleh mengakses nilai stdout dan stderr dengan menggunakan “output.stdout "dan" output.kaedah stderr. Keluaran dihasilkan sebagai urutan bait. Untuk mendapatkan rentetan sebagai output, gunakan “output.stdout.kaedah penyahkodan ("utf-8") ". Anda juga boleh memberikan "text = True" sebagai argumen tambahan kepada subproses.jalankan panggilan untuk mendapatkan output dalam format rentetan. Untuk mendapatkan kod status keluar, anda dapat menggunakan “output.kaedah kod pengembalian.

Contoh 4: Tingkatkan Pengecualian atas Kegagalan Perintah yang Dilaksanakan oleh Subproses.jalankan Kaedah

Untuk menaikkan pengecualian ketika perintah keluar dengan status bukan nol, gunakan argumen "check = True".

subproses import
subproses.jalankan (["kucing", "data.tx "], capture_output = Benar, teks = Benar, periksa = Benar)

Menjalankan kod di atas akan menghasilkan output berikut:

menaikkan CalledProcessError (kod semula, proses.berhujah,
subproses.CalledProcessError: Perintah '[' cat ',' data.tx ']'
mengembalikan status keluar bukan sifar 1.

Contoh 5: Serahkan String to Command yang Dilaksanakan oleh Subproses.jalankan Kaedah

Anda boleh meneruskan rentetan ke perintah yang akan dijalankan oleh subproses.jalankan kaedah dengan menggunakan argumen "input = 'string'".

subproses import
output = subproses.jalankan (["cat"], input = "data.txt ", capture_output = Benar,
teks = Benar, tandakan = Benar)
cetak (keluaran)

Menjalankan kod di atas akan menghasilkan output berikut:

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

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

dengan data terbuka (".txt ") sebagai f:
output = subproses.jalankan (["cat"], stdin = f, capture_output = True,
teks = Benar, tandakan = Benar)
cetak (keluaran)

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 Subproses.jalankan Kaedah

Adalah mungkin untuk menjalankan perintah secara langsung ke dalam shell "sebagaimana adanya" daripada menggunakan string yang terbelah dalam perintah utama dan pilihan yang mengikutinya. Untuk melakukan ini, anda mesti memasukkan “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 sini.

subproses import
subproses.jalankan ("kucing" data.txt '", shell = Benar)

Menjalankan kod di atas akan menghasilkan output berikut:

nama = John

Kesimpulannya

Subproses.kaedah 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 berasingan. Akan tetapi, agak sukar untuk menandakan perintah shell dengan betul dalam senarai python. Anda boleh menggunakan “shlex.kaedah 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 argumen "shell = True" untuk mengelakkan ini, tetapi ada masalah keselamatan tertentu yang berkaitan dengan tindakan ini.

5 Permainan Arcade Terbaik untuk Linux
Pada masa kini, komputer adalah mesin serius yang digunakan untuk permainan. Sekiranya anda tidak dapat memperoleh skor tinggi baru, anda akan tahu ma...
Battle For Wesnoth 1.13.6 Pembangunan Dikeluarkan
Battle For Wesnoth 1.13.6 dilancarkan bulan lalu, adalah rilis pengembangan keenam di 1.13.siri x dan memberikan sejumlah penambahbaikan, terutamanya ...
Cara Memasang League Of Legends di Ubuntu 14.04
Sekiranya anda peminat League of Legends, maka ini adalah peluang bagi anda untuk menguji menjalankan League of Legends. Perhatikan bahawa LOL disokon...