Python: 如何重定向此输出?

10 投票
2 回答
23408 浏览
提问于 2025-04-16 05:49

我在用子进程调用rtmpdump,并想把它的输出重定向到一个文件里。问题是我就是无法重定向它。

我先尝试把sys.stdout设置为打开的文件。这样做对一些命令,比如ls,是有效的,但对rtmpdump却不行。我也试着把sys.stderr设置了一下,结果也没用。

接着我又尝试在命令行参数中用">> 文件"的方式,但同样没有效果。

另外,顺便提一下,不知道为什么,即使我用subprocess.call而不是subprocess.check_output,Eclipse也会打印出rtmpdump的输出,而且不需要调用print方法。这真是太神奇了!

有没有什么建议呢?

补充:这里有一些示例代码。

    # /!\ note: need to use os.chdir first to get to the folder with rtmpdump!
    command = './rtmpdump -r rtmp://oxy.videolectures.net/video/ -y 2007/pascal/bootcamp07_vilanova/keller_mikaela/bootcamp07_keller_bss_01 -a video -s http://media.videolectures.net/jw-player/player.swf -w ffa4f0c469cfbe1f449ec42462e8c3ba16600f5a4b311980bb626893ca81f388 -x 53910 -o test.flv'
    split_command = shlex.split(command)
    subprocess.call(split_command)

2 个回答

1

请查看这个链接,了解如何从子进程获取输出:

我想,方法是收集输出并直接写入文件,或者提供文件描述符,让输出可以写入这些地方。

大概可以这样做:

f = open('dump.txt', 'wb')
p = subprocess.Popen(args, stdout=f, stderr=subprocess.STDOUT, shell=True)
21

sys.stdout 是 Python 中用来表示父进程输出流的一个概念。

如果你想改变子进程的输出流,可以这么做。

subprocess.call 和 subprocess.Popen 这两个函数可以接收命名参数,用来指定输出流。

所以,你可以先打开一个文件,然后把这个文件作为参数传给 subprocess。

f = open("outputFile","wb")
subprocess.call(argsArray,stdout=f)

你提到使用 >>,这说明你可能在用 shell=True,或者认为你是在把参数传给 shell。其实,使用 subprocess 的数组形式会更好,这样可以避免不必要的进程和一些奇怪的 shell 行为。

编辑:

我下载了 RTMPDump 并试了一下,发现消息是出现在 stderr(标准错误输出)上。

所以在下面这个程序中,程序的输出什么都没有,而 rtmpdump 的日志则写入了 stderr.txt 文件:

#!/usr/bin/env python

import os
import subprocess

RTMPDUMP="./rtmpdump"
assert os.path.isfile(RTMPDUMP)
command = [RTMPDUMP,'-r','rtmp://oxy.videolectures.net/video/',
        '-y','2007/pascal/bootcamp07_vilanova/keller_mikaela/bootcamp07_keller_bss_01',
        '-a','video','-s',
        'http://media.videolectures.net/jw-player/player.swf',
        '-w','ffa4f0c469cfbe1f449ec42462e8c3ba16600f5a4b311980bb626893ca81f388'
        ,'-x','53910','-o','test.flv']


stdout = open("stdout.txt","wb")
stderr = open("stderr.txt","wb")
subprocess.call(command,stdout=stdout,stderr=stderr)

撰写回答