如何将Python进程的输出用Python管道传输?

2024-06-20 15:12:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我在写一个程序,用^{}从YouTube下载视频。在

我曾经用subprocess给youtube dl打电话:

import subprocess

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

然后,我将通过调用以下命令读取进程的输出:

^{pr2}$

但是,我更喜欢使用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重定向到自定义输出流将不起作用,因为我仍然需要这样做系统标准输出打印。在

你能帮我吗?在


Tags: import程序true视频youtubestderrstdoutcommand
2条回答

特别是对于youtube dl,可以设置logger对象,如文档中的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])

你可以尝试重定向系统标准输出到您自己的输出流
参见: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()

如果你想输出到stdout 在重定向期间,使用旧的而不是打印_标准输出写入()

相关问题 更多 >