2015-02-03 3 views
3

Я пишу программу, которая загружает видео с YouTube, используя youtube-dl.Как я могу выполнить вывод процесса Python в Python?

Я имел обыкновение называть YouTube-DL с subprocess:

import subprocess 

p = subprocess.Popen([command], \ 
    stdout=subprocess.PIPE, \ 
    stderr=subprocess.STDOUT, \ 
    universal_newlines = True) 

Затем я прочитал бы результат процесса по телефону:

for line in iter(p.stdout.readline, ""): 
    hide_some_stuff_using_regex() 
    show_some_stuff_using_regex() 

Однако я предпочитаю использовать youtube-dl как класс Python , Так что я сейчас делаю это:

from youtube_dl import YoutubeDL as youtube_dl 

options = {"restrictfilenames": True, \ 
      "progress_with_newline": True} 

ydl = youtube_dl(options) 
ydl.download([url]) 

код работает, но я с трудом выяснить, как вывести трубы youtube-dl «ы. Обратите внимание, что я хочу использовать части вывода youtube-dl для печати в режиме реального времени, поэтому перенаправление sys.stdout на пользовательский выходной поток не будет работать, так как мне все еще нужно sys.stdout для печати.

Вы можете мне помочь?

+0

Что такое 'youtube_dl'? –

+0

Хороший улов, обновленный. –

ответ

3

Специально для вас трубки дл, вы можете установить объект лесоруба, как и в advanced example в документации:

from youtube_dl import YoutubeDL 


class MyLogger(object): 
    def debug(self, msg): 
     print('debug information: %r' % msg) 

    def warning(self, msg): 
     print('warning: %r' % msg) 

    def error(self, msg): 
     print('error: %r' % msg) 


options = { 
    "restrictfilenames": True, 
    "progress_with_newline": True, 
    "logger": MyLogger(), 
} 

url = 'http://www.youtube.com/watch?v=BaW_jenozKc' 
with YoutubeDL(options) as ydl: 
    ydl.download([url]) 
+0

Красивые. Отлично, чтобы быть в контакте с самим разработчиком! –

1

Вы можете попытаться перенаправить sys.stdout на свой выходной поток
посмотреть: https://stackoverflow.com/a/1218951/2134702


процитировать связанный ответ:

from cStringIO import StringIO 
import sys 

old_stdout = sys.stdout 
sys.stdout = mystdout = StringIO() 

# blah blah lots of code ... 

sys.stdout = old_stdout 

# examine mystdout.getvalue() 

И если вы хотите вывести на стандартный вывод во время перенаправления, вместо печати используйте old_stdout.write()

+1

Это должен быть комментарий, а не ответ. –

+0

Я думал об этом, но с момента переадресации 'sys.stdout' в выходной поток я больше не могу использовать печать, не так ли? Операторы печати будут перенаправлены на выходной поток и не будут напечатаны на моем экране. Это проблема, потому что я хочу напечатать некоторые части вывода youtube-dl на моем экране в режиме реального времени. –

+0

@ Exeleration-G, если вы сохраните поток stdout (как показано в связанном ответе), вы можете записать его (вместо команды печати), и он будет напечатан на главном экране в реальном времени. – Eran

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

  • Нет связанных вопросов^_^