2014-01-24 2 views
0

У меня есть следующий код и я пытаюсь запустить в Idle в linux.Чтение подпроцесса чтения не дает никакого вывода

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(['youtube-dl', '-l', '-c', 'https://www.youtube.com/watch?v=utV1sdjr4PY'], 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 
while True: 
    try: line = q.get_nowait() # or q.get(timeout=.1) 
    except Empty: 
     pass 
     #print('no output yet') 
    else: # got line 
     print line 

Но всегда печатается «нет вывода». Редактировать: Я редактировал код, и он работает. Но у меня другая проблема. Процент загрузки обновляется в одной строке, но код читает его только после завершения строки

+0

Из-за бикини, может быть? попробуйте sys.stdout.write («\ rNo line») вместо печати («no output yet»). Вы увидите некоторый результат, но я не знаю, является ли тот, который вы ищете – cox

+0

@cox. Какое это имеет отношение к бикини? –

+1

Попробуйте сценарий (или следуйте ссылке на YouTube). Это «Sexy Bikini Girls Epic Fail Compilation 2013-AYlb-7TXMxM.mp4». – cox

ответ

1

ОК, давайте поместим комментарии в ответ.

import sys, os 
from subprocess import PIPE, Popen 
from time import sleep 
import pty 

master, slave = pty.openpty() 
stdout = os.fdopen(master) 

p = Popen(['youtube-dl', '-l', '-c', 'https://www.youtube.com/watch?v=AYlb-7TXMxM'], shell=False,stdout=slave,stderr=slave, close_fds=True) 

while True: 
    #line = stdout.readline().rstrip() - will strip the new line 
    line = stdout.readline() 
    if line != b'': 
     sys.stdout.write("\r%s" % line) 
     sys.stdout.flush() 
    sleep(.1) 

Если вы хотите нить и время с различным я sugest обертывания в классе и избежать очередей. Выход «небуферизован» - спасибо @FilipMalckzak

+0

P.S .: Я вижу, вы изменили ссылку. У меня нет проблем с роботами, но все быстрее движется с бикини. – cox

+0

Ваш скрипт по-прежнему не печатает новые строки, пока они не закончатся. – Ufoguy

+0

Это работает для меня. Меня нет дома, но я повторю проверку. На какой платформе вы работаете? – cox

Смежные вопросы