Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Menghantar Rentetan dengan Betul ke `subprocess.Popen` melalui stdin?

Bagaimana untuk Menghantar Rentetan dengan Betul ke `subprocess.Popen` melalui stdin?

DDD
DDDasal
2024-12-05 09:54:12565semak imbas

How to Correctly Pass Strings to `subprocess.Popen` via stdin?

Melalukan String ke subproses.Popen melalui stdin

Masalah

Percubaan untuk menggunakan StringIO dengan subproses.Popen untuk stdin menghasilkan AttributeError.

import subprocess
from cStringIO import StringIO
subprocess.Popen(['grep', 'f'], stdout=subprocess.PIPE, stdin=StringIO('one\ntwo\nthree\nfour\nfive\nsix\n')).communicate()[0]

Ralat

Traceback menyerlahkan ketidakserasian cStringIO.StringIO dengan kaedah fileno() yang diperlukan oleh subprocess.Popen.

AttributeError: 'cStringIO.StringI' object has no attribute 'fileno'

Penyelesaian

Subproses. Dokumentasi Popen memerlukan penggunaan stdin=PAIP untuk penghantaran data ke stdin. Sintaks penggantian os.popen() disyorkan:

pipe = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE).stdin

Contoh

Menyesuaikan kod asal:

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())
# -> four
# -> five
# ->

Penyelesaian Python 3.5

Untuk Python 3.5 :

#!/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)
# -> 0
print(p.stdout)
# -> four
# -> five
# -> 

Atas ialah kandungan terperinci Bagaimana untuk Menghantar Rentetan dengan Betul ke `subprocess.Popen` melalui stdin?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn