在生成器中将Python输出打印到stderr

0 投票
1 回答
610 浏览
提问于 2025-04-17 05:15

我在用Python写一个文件系统的时候,在我的readdir生成器的第一行代码是一个打印语句。但是这个打印内容在我的控制台上从来没有出现过。我想这可能是缓冲的问题,所以我把它改成了打印到错误输出(stderr),但还是没有任何输出。

接着我在下一行加了一个手动刷新,结果还是没有任何反应。

然后我在下一行加了一个time.sleep(3),程序确实会暂停3秒。

def readdir(self, path, offset):
    print >> sys.stderr, 'Text'
    sys.stderr.flush()
    time.sleep(3)

接下来我用其他代码填充目录(yield fuse.Direntry),这时候我能看到输出,并且可以在终端里用ls命令查看我挂载的fuse目录的内容,但我想知道为什么这个打印命令在这个生成器里不工作。

更新

对于那些遇到困难的人:

def readdir(self, path, offset):
    print >> sys.stderr, 'Text'
    sys.stderr.flush()
    for o in os.listdir( "." + path ):
        yield fuse.Direntry(o)

这是代码。它生成了一个文件列表,我可以在里面移动,这没问题。问题是我从来没有看到'Text'出现,不管是在标准输出(STDOUT)、错误输出(STDERR)还是其他地方。

我只是想问为什么这个问题只出现在这个生成器里。我可以在fuse代码的其他地方放打印语句,并且能正常输出。

1 个回答

1

你的FUSE代码是在FUSE库的控制下运行的,所以你不能确定stdin(标准输入)、stdout(标准输出)和stderr(标准错误输出)是不是你终端会话中的那些流。很有可能readdir这个生成器在调用时使用的是其他的std*流。

因为你提到你FUSE代码的其他部分print没有问题,你可以在所有print语句前加上一些调试日志信息(比如sys.stdout.isatty()的值,或者repr(sys.stdout)的输出),这样可以帮助你理解发生了什么。

撰写回答