pweave не печатает значение переменной в фрагменте кода - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь использовать pweave с LaTeX для воспроизводимых исследований.Я вижу странное поведение при попытке отобразить значение переменной в фрагменте кода.Я надеюсь, что кто-то может объяснить, что происходит.

При вызове print () внутри фрагмента кода, в зависимости от того, что должно быть напечатано, pweave иногда создает дословный раздел в файле разметки для кода, но не длявывод кода.

Средой является Ubuntu 18.04, python 3.6.8 и python-pweave 0.25-1 из репозиториев Ubuntu.(Это последняя доступная версия.)

Я экспериментировал с несколькими вариантами, чтобы определить, что работает, а что нет.Кажется, проблема возникает или нет, в зависимости от количества строк или символов, которые будут напечатаны фрагментом кода.

Я использую функцию pweave.weave () с форматом noweb следующим образом:

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}

Существуют отдельные дословные разделы для фрагмента кода и вывода интерпретатора.

С другой стороны, этот фрагмент кода не 't work.

<<>>=
x = 3
print( x )
@

Он производит следующий вывод:

\begin{verbatim}
x = 3
print( x )
\end{verbatim}

Нет стенографического раздела для вывода интерпретатора.

Другой работающий пример:this.

<<>>=
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 голосов
/ 27 июня 2019

Я не уверен в протоколе для ответа на мой собственный вопрос, но я думаю, что теперь я знаю, что происходит.

Функция python print () при записи в файл использует буферизованный ввод / вывод,Вывод записывается в буфер в памяти и записывается в файл только тогда, когда число байтов в буфере достигает определенного порога, программа завершается или буфер очищается.По-видимому, буфер не очищается в конце каждого чанка, прежде чем pweave собирает выходные данные из файла, в котором он накапливается.

Можно утверждать, что это не является строго ошибкой в ​​pweave, потому что этозадокументированное поведение print ().Тем более что достижение конца фрагмента не прекращает работу программы.Но может показаться, что очистка выходного буфера в конце каждого чанка будет наиболее подходящим поведением.

Простой обходной путь - вызвать sys.stdout.flush () в качестве последнего оператора в каждомчанк, который вызывает print ().Это гарантирует, что весь вывод записывается в файл до окончания фрагмента.Можно также включить параметр flush = True в последнем вызове печати в каждом чанке.

...