我正在研究Ipython,希望获取有关os.stat
的帮助信息,并将输出重定向到普通的markdown文件:
In [57]: with contextlib.redirect_stdout(open("stat_help_docs.md", "w")):
...: help(os.stat)
...:
In [58]: os.stat("stat_help_docs.md").st_size
Out[58]: 1
“ stat_help_docs.md”为空,无法向其中写入帮助文档。
但是,如果我在标准Python交互模式下尝试过:
>>> import os
>>> import contextlib
>>> with contextlib.redirect_stdout(open("another_stat_help_docs.md", "w")):
... help(os.stat)
...
>>> os.stat("another_stat_help_docs.md").st_size
919
成功写入文件。
我认为问题可能出在Ipython的设置上,
请提供任何提示以帮助您解决问题吗?
答案 0 :(得分:1)
您需要刷新文件写入缓冲区:
In [9]: f = open('stat_help_docs.txt', 'w')
In [10]: with contextlib.redirect_stdout(f):
...: help(os.stat)
In [11]: os.stat("stat_help_docs.txt").st_size
Out[11]: 0
In [12]: f.flush()
In [13]: os.stat("stat_help_docs.txt").st_size
Out[13]: 919
在标准python shell中,文件对象在with
上下文之后立即被回收,并且刷新了底层的写缓冲区,不知道为什么IPython shell为该文件对象保留了额外的引用。
但是IMO不应依赖GC刷新写缓冲区,而是将文件obj用作上下文管理器(with open('...'):
)或显式刷新。