簡體   English   中英

“ contextlib.redirect_stdout”不適用於Ipython

[英]“contextlib.redirect_stdout” not working on Ipython

我正在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的設置上,
請提供任何提示來幫助您解決問題?

您需要刷新文件寫緩沖區:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM