pweave不打印代码块中变量的值

时间:2019-06-25 12:25:27

标签: python latex pweave

我正尝试将pweave与LaTeX结合使用以进行可重复的研究。我看到了奇怪的行为,试图在代码块中显示变量的值。我希望有人能解释发生了什么。

当在代码块中调用print()时,根据要打印的内容,pweave有时会在标记文件中为该代码而不是该代码的输出产生逐字记录部分。

环境是Ubuntu存储库中的Ubuntu 18.04,python 3.6.8和python-pweave 0.25-1。 (这是可用的最新版本。)

我已经尝试了多种变体来确定哪些有效,哪些无效。根据代码块将打印的行数或字符数,该问题似乎发生与否。

我正在使用noweb格式的pweave.weave()函数,如下所示:

pweave.weave(文件名,doctype ='tex',informat ='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}

1 个答案:

答案 0 :(得分:0)

我不确定回答自己的问题的协议,但是我相信我现在知道发生了什么事。

当写入文件时,python print()函数使用缓冲的I / O。输出写入内存中的缓冲区,并且仅在缓冲区中的字节数达到某个阈值,程序终止或刷新缓冲区时才写入文件。显然,在pweave从文件中收集累积输出的文件之前,不会在每个块的末尾刷新缓冲区。

一个人可能会争辩说,这并不是严格的pweave错误,因为这是print()的已记录行为。特别是因为到达块的末尾并不会终止程序。但显然,在每个块末尾刷新输出缓冲区似乎是最适当的行为。

一个简单的解决方法是调用sys.stdout.flush()作为每个调用print()的块中的最后一条语句。这样可以确保在块结束之前将所有输出写入文件。还可以在每个块的最后一个打印调用中包含参数flush = True。