在生成器中将Python输出打印到stderr
我在用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)
的输出),这样可以帮助你理解发生了什么。