“ contextlib.redirect_stdout”不适用于Ipython

时间:2018-08-21 05:18:47

标签: python

我正在研究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的设置上,
请提供任何提示以帮助您解决问题吗?

1 个答案:

答案 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('...'):)或显式刷新。