首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pweave不打印代码块中变量的值

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

Stack Overflow用户
提问于 2019-06-25 20:25:28
回答 1查看 95关注 0票数 0

我正在尝试使用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 )

下面的代码块“正确”地工作。

代码语言:javascript
复制
<<>>=
x = 3.14
print( x )
@

它在.tex文件中生成以下内容:

代码语言:javascript
复制
\begin{verbatim}
x = 3.14
print( x )
\end{verbatim}
\begin{verbatim}
3.14

\end{verbatim}

代码块和解释器输出有单独的逐字记录部分。

另一方面,这个代码块不起作用。

代码语言:javascript
复制
<<>>=
x = 3
print( x )
@

它会产生以下输出:

代码语言:javascript
复制
\begin{verbatim}
x = 3
print( x )
\end{verbatim}

解释器的输出没有逐字记录的部分。

另一个有效的例子是这个。

代码语言:javascript
复制
<<>>=
x = 33
print( x )
print( "Something else" )
@

它会生成以下输出:

代码语言:javascript
复制
\begin{verbatim}
x = 33
print( x )
print( "Something else" )
\end{verbatim}
\begin{verbatim}
33
Something else

\end{verbatim}

同样,有两个单独的逐字部分。

然而,这并不起作用。

代码语言:javascript
复制
<<>>=
X = 33
print( x )
@

它会产生这样的输出。

代码语言:javascript
复制
\begin{verbatim}
X = 33
print( x )
\end{verbatim}
EN

回答 1

Stack Overflow用户

发布于 2019-06-27 07:19:19

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

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

有人可能会争辩说,严格来说,这不是pweave中的一个bug,因为这是print()的文档化行为。特别是因为到达块的末尾并不会终止程序。但是,在每个区块的末尾刷新输出缓冲区似乎是最合适的行为。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56754022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档