Melalukan Input Rentetan kepada subproses.Popen
Ralat yang dihadapi semasa cuba menghantar objek StringIO sebagai stdin kepada subproses.Popen mendedahkan StringIO itu objek tidak diiktiraf sebagai objek seperti fail yang sah oleh subproses. Untuk menyelesaikan isu ini dan berjaya menghantar rentetan sebagai stdin, anda perlu membuat saluran paip ke proses Popen dahulu.
Menggunakan Penciptaan Saluran Paip Eksplisit
Subproses. communication() dokumentasi mencadangkan mewujudkan saluran paip dengan stdin=PIPE untuk menghantar data ke stdin proses. Ini boleh dicapai dengan mengubah suai kod seperti berikut:
import subprocess from subprocess import Popen, PIPE, STDOUT p = Popen(['grep', 'f'], stdout=PIPE, stdin=PIPE, stderr=STDOUT) grep_stdout = p.communicate(input=b'one\ntwo\nthree\nfour\nfive\nsix\n')[0] print(grep_stdout.decode())
Kod ini mencipta paip ke proses grep, membenarkan rentetan input dihantar melalui argumen stdin.
Menggunakan subprocess.run (Python 3.5 )
Untuk Python versi 3.5 dan lebih tinggi, subprocess.run boleh digunakan untuk menghantar input sebagai rentetan dan mendapatkan semula output sebagai rentetan dalam satu panggilan:
#!/usr/bin/env python3 from subprocess import run, PIPE p = run(['grep', 'f'], stdout=PIPE, input='one\ntwo\nthree\nfour\nfive\nsix\n', encoding='ascii') print(p.returncode) print(p.stdout)
Pendekatan ini menyediakan alternatif ringkas kepada kaedah penciptaan saluran paip yang jelas.
Atas ialah kandungan terperinci Bagaimana untuk Melewati String sebagai stdin kepada subprocess.Popen?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!