0

我正在尝试使用 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',输出=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}
4

1 回答 1

0

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

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

有人可能会争辩说,这严格来说不是 pweave 中的错误,因为这是 print() 的记录行为。特别是因为到达块的末尾并没有终止程序。但是,在每个块的末尾刷新输出缓冲区肯定是最合适的行为。

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

于 2019-06-26T23:19:19.143 回答