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 importsubproses.jalankan (["kucing", "data.txt "])
Menjalankan kod di atas akan mengembalikan output berikut:
nama = JohnSelesaiProses (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 importsubproses.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 importoutput = 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 importsubproses.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 importoutput = 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 importsubproses.jalankan ("kucing" data.txt '", shell = Benar)
Menjalankan kod di atas akan menghasilkan output berikut:
nama = JohnKesimpulannya
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.