SORU
2 EKİM 2008, PERŞEMBE


Python - Nasıl alt süreci içine bir dize geçmek.Popen (stdin argümanı kullanarak)?

Eğer aşağıdaki yaparsam:

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

Anlıyorum:

Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "/build/toolchain/mac32/python-2.4.3/lib/python2.4/subprocess.py", line 533, in __init__
    (p2cread, p2cwrite,
  File "/build/toolchain/mac32/python-2.4.3/lib/python2.4/subprocess.py", line 830, in _get_handles
    p2cread = stdin.fileno()
AttributeError: 'cStringIO.StringI' object has no attribute 'fileno'

Görünüşe göre bir cStringİO.StringİO nesne yeterince yakın alt işlemi uygun bir dosya ördek şarlatan değil.Popen. Bu nasıl bir çözüm?

CEVAP
3 EKİM 2008, Cuma


Popen.communicate() belgeler:

Eğer veri göndermek istiyorsanız unutmayın işlemin stdin, gerek bu Popen ile nesne yaratmak stdin=BORU. Benzer şekilde, bir şey almak için sonuç olarak Hiçbiri başlığın dışında stdout=BORU ve/veya vermelisin stderr=BORU da.

İşletim sistemi değiştiriliyor.* popen

    pipe = os.popen(cmd, 'w', bufsize)
    # ==>
    pipe = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE).stdin

Uyarıİletişim() kullanmak yerine stdin.(yaz), stdout.() okuma ya stderr.() okuma kilitlenmeleri önlemek amacıyla diğer OS boru tamponlar için dolduruyor ve çocuk engelleme süreç.

Örnek aşağıdaki gibi yazılabilir

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
# ->

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • karneson

    karneson

    23 Temmuz 2006
  • Pepsi

    Pepsi

    1 Kasım 2005
  • Peter Sharp

    Peter Sharp

    11 ŞUBAT 2013