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

  • HowcastSportsFitness

    HowcastSport

    11 Mayıs 2011
  • InfinityWard

    InfinityWard

    19 EYLÜL 2006
  • picster

    picster

    20 NİSAN 2006