У меня есть программа, в которой я создаю множество файлов LaTeX один за другим. При создании этих файлов LaTeX важно убедиться, что они действительно могут быть скомпилированы в .pdf без ошибок.
Для этого он использует subprocess.call(['pdflatex', '-halt-on-error', tex_file_name])
.
Который возвращает 0
при успешной компиляции из .tex
в .pdf
и 1 в противном случае.
Проблема, с которой я сталкиваюсь, заключается в том, что единственное обстоятельство, при котором эта строка кода не делает того, что, по моему мнению, она должна делать, - это когда ее запускает py.test
. Если я запускаю этот код из интерпретатора или запускаю скрипт из командной строки, он работает. Но py.test этого не делает.
Когда py.test
ошибается, он оставляет после себя файл журнала, созданный pdflatex
, в котором есть эта ошибка:
{c:/texlive/2012/texmf-var/fonts/map/pdftex/updmap/pdftex.map
!pdfTeX error: pdflatex.exe (file c:/texlive/2012/texmf-var/fonts/map/pdftex/up
dmap/pdftex.map): fflush() failed (Bad file descriptor)
==> Fatal error occurred, no output PDF file produced!
Рискну предположить, что py.test
делает нечто с файлом .tex
до того, как pdflatex
сможет его скомпилировать. Но я не знаю что.
О временных файлах и каталогах говорится в документах py.test. Я не знаю, имеют ли они отношение к моей проблеме, но я только немного поиграл с ними.
Если вы хотите посмотреть на код, тестовый пример выглядит так:
from a import Foo
from b import Tree
from latex_tester import latex_tester
def test_Foo():
q1 = foo.Foo()
latex_tester(Tree(1, q1))
и latex_tester выглядит так:
import uuid
import os
import subprocess
def latex_tester(tree):
""" Test whether latex is compilable to a PDF.
"""
full_path = r'some_path'
uid = str(uuid.uuid1())
file_name = os.path.join(full_path, 'test' + uid + '.tex')
with open(file_name, 'w') as f:
_write_tree(f, tree)
retcode = subprocess.call(['pdflatex', '-halt-on-error', file_name])
if retcode != 0:
raise RuntimeError("This latex could not be compiled.")
full_path
относительным или абсолютным путем? - person six8   schedule 04.09.2013with
завершается. - person six8   schedule 04.09.2013