py.test не справляется с созданием файлов

У меня есть программа, в которой я создаю множество файлов 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.")

person nebffa    schedule 04.09.2013    source источник
comment
Является ли full_path относительным или абсолютным путем?   -  person six8    schedule 04.09.2013
comment
Можете ли вы попытаться явно закрыть файл до выполнения вызова подпроцесса?   -  person Joe Young    schedule 04.09.2013
comment
py.test не связывается с файлами, которые вы создаете, если вы не используете py.test для создания файлов. Получите путь к файлу, созданному тестами, затем попробуйте запустить его вручную с этим файлом. Бьюсь об заклад, что-то не так с файлом, а не с тестом.   -  person six8    schedule 04.09.2013
comment
Файл уже закрывается автоматически, когда with завершается.   -  person six8    schedule 04.09.2013
comment
@Cixate Вы имеете в виду запуск pdflatex вручную для созданного файла .tex? Если это так, латекс прекрасно компилируется, когда я запускаю pdflatex вне py.test.   -  person nebffa    schedule 05.09.2013


Ответы (2)


Как ни странно, использование «xelatex» вместо «pdflatex» заставляет все работать как обычно.

Для будущих читателей: у меня установлен TeXworks, который предположительно установил оба этих инструмента. Я не знаю, влияет ли xelatex на итоговый PDF-файл. Кажется, он создает хороший .pdf

В любом случае, я дал этот ответ на свой вопрос, так как, похоже, ничего другого не предвидится, и это, безусловно, решило мою проблему.

person nebffa    schedule 09.09.2013

У меня была точно такая же проблема.

Я использую C # в качестве языка программирования для создания документов .tex, и он завис во время pdflatex, когда я включил изображение в pdf.

И это сработало, если я запустил его вручную...

Ошибка:

pdfTeX warning: pdflatex
!pdfTeX error: pdflatex (file <linktoFile>/file.pdf): fflush() failed (Bad file descriptor)

К сожалению, xelatex тоже не работал, поэтому я искал и в конце концов наткнулся на него.

В основном ошибка произошла для меня в этой строке:

string tex = tex.Replace("\uFFFD\uFFFDMEMNAME\uFFFD\uFFFD", user.Surname)

Здесь user.Surname был нулевым.

Когда текстовая строка сохраняется в файле, она таинственным образом запоминает нуль, и pdflatex падает где-то совсем в другом месте. Если вы, с другой стороны, снова запустите pdflatex в том же файле вручную, нуль исчезнет, ​​и он будет работать.

Вся эта каша исчезла, когда я ввел Фамилию, и теперь она работает из программы.

Возможно, это поможет кому-то с такой же проблемой.

person Vulcano    schedule 04.06.2014