我正在尝试使用pweave和LaTeX进行可重现的研究。我看到一些奇怪的行为,试图在代码块中显示变量的值。我希望有人能解释一下发生了什么。
在代码块中调用print()时,根据要打印的内容,pweave有时会在标记文件中为代码生成一个逐字部分,但不会为代码的输出生成一个完整的部分。
环境是Ubuntu存储库中的Ubuntu 18.04、python 3.6.8和python-pweave 0.25-1。(这是可用的最新版本。)
我已经尝试了许多不同的方法来决定什么可以工作,什么不能工作,这个问题可能会发生,或者不会发生,这取决于代码块打印的行数或字符数。
我将pweave.weave()函数与noweb格式一起使用,如下所示:
pweave.weave(文件名,文档类型=‘tex’,信息格式=‘noweb’,output=outfile )
下面的代码块“正确”地工作。
<<>>=
x = 3.14
print( x )
@它在.tex文件中生成以下内容:
\begin{verbatim}
x = 3.14
print( x )
\end{verbatim}
\begin{verbatim}
3.14
\end{verbatim}代码块和解释器输出有单独的逐字记录部分。
另一方面,这个代码块不起作用。
<<>>=
x = 3
print( x )
@它会产生以下输出:
\begin{verbatim}
x = 3
print( x )
\end{verbatim}解释器的输出没有逐字记录的部分。
另一个有效的例子是这个。
<<>>=
x = 33
print( x )
print( "Something else" )
@它会生成以下输出:
\begin{verbatim}
x = 33
print( x )
print( "Something else" )
\end{verbatim}
\begin{verbatim}
33
Something else
\end{verbatim}同样,有两个单独的逐字部分。
然而,这并不起作用。
<<>>=
X = 33
print( x )
@它会产生这样的输出。
\begin{verbatim}
X = 33
print( x )
\end{verbatim}发布于 2019-06-27 07:19:19
我不确定回答我自己问题的协议,但我相信我现在知道发生了什么。
在写入文件时,python print()函数使用缓冲的I/O。输出被写入内存中的缓冲区,只有当缓冲区中的字节数达到某个阈值、程序终止或缓冲区被刷新时,输出才会写入文件。显然,在pweave从累积缓冲区的文件中收集输出之前,缓冲区不会在每个块的末尾被刷新。
有人可能会争辩说,严格来说,这不是pweave中的一个bug,因为这是print()的文档化行为。特别是因为到达块的末尾并不会终止程序。但是,在每个区块的末尾刷新输出缓冲区似乎是最合适的行为。
一种简单的解决方法是调用sys.stdout.flush()作为调用print()的每个块中的最后一条语句。这样可以确保在区块结束之前将所有输出写入文件。还可以将最后一次打印调用中的参数flush=True包含在每个块中。
https://stackoverflow.com/questions/56754022
复制相似问题