SORU
17 Aralık 2008, ÇARŞAMBA


Engellenmeyen bir alt süreci okumaya devam edin.Python BORU

Bir alt süreci başlatmak ve çıkış akışı bağlanmak için subprocess module (stdout) kullanıyorum. Engellenmeyen onun stdout okur çalıştırmak mümkün olmak istiyorum. Bir yol yapmak için vardır .engellenmeyen veya akış veri olup olmadığını kontrol etmek için önce seçeneği .readline çağırmak? Bu taşınabilir olması ya da en azından Windows ve Linux altında çalışmak isterim.

şimdilik (eğer veriler mevcuttur .readline engelleme) nasıl yaptığımı burada

p = subprocess.Popen('myprogram.exe', stdout = subprocess.PIPE)
output_str = p.stdout.readline()

CEVAP
4 ŞUBAT 2011, Cuma


fcntl, 12*, asyncproc *Bu durumda yardımcı olmaz.

Hem Windows hem de Linux üzerinde engelleme olmadan akışı okumak için güvenilir bir yol Queue.get_nowait() kullanmak için:

import sys
from subprocess import PIPE, Popen
from threading  import Thread

try:
    from Queue import Queue, Empty
except ImportError:
    from queue import Queue, Empty  # python 3.x

ON_POSIX = 'posix' in sys.builtin_module_names

def enqueue_output(out, queue):
    for line in iter(out.readline, b''):
        queue.put(line)
    out.close()

p = Popen(['myprogram.exe'], stdout=PIPE, bufsize=1, close_fds=ON_POSIX)
q = Queue()
t = Thread(target=enqueue_output, args=(p.stdout, q))
t.daemon = True # thread dies with the program
t.start()

# ... do other things here

# read line without blocking
try:  line = q.get_nowait() # or q.get(timeout=.1)
except Empty:
    print('no output yet')
else: # got line
    # ... do something with line

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • fufko

    fufko

    27 ŞUBAT 2006
  • GoldgenieOfficial

    GoldgenieOff

    23 Temmuz 2009
  • Trulia

    Trulia

    29 Kasım 2006