#python #flask #miktex
#python #flask #miktex
Вопрос:
Я пытаюсь создать файл latex, используя вызов подпроцесса в веб-приложении flask.
def pdf(self, ixTestsheet):
build_dir = mkdtemp(prefix="testsheet_")
tsfile = NamedTemporaryFile(dir=build_dir, suffix=".tex", delete=False)
tsfile.write(self.latex(ixTestsheet, _print_type).encode("utf-8"))
old_dir = os.getcwd()
# os.chdir(build_dir)
latexname = os.path.basename(tsfile.name)
tsfile.close()
# added this to check user of subprocess
dirout = subprocess.run(
["whoami.exe"], cwd=build_dir, check=True, capture_output=True
)
current_app.logger.info(dirout)
try:
subprocess.run(
[
current_app.config["LUALATEX_EXE"],
"--interaction=nonstopmode",
latexname,
],
cwd=build_dir,
check=True,
)
# call a second time to get a full build with page numbers etc.
subprocess.run(
[
current_app.config["LUALATEX_EXE"],
"--interaction=nonstopmode",
latexname,
],
cwd=build_dir,
check=True,
)
except subprocess.CalledProcessError as e:
current_app.logger.error(build_dir)
current_app.logger.error(e)
Если я запускаю процесс из приложения flask, он завершается ошибкой со следующей ошибкой. Если я запускаю команду из интерактивного сеанса python, она завершается.
[2020-12-04 11:51:13,512] INFO in testsheets: CompletedProcess(args=['whoami.exe'], returncode=0, stdout=b'<DOMAINNAME>\<USERNAME>rn', stderr=b'')
lualatex.exe: No suitable temporary directory found.
Sorry, but "c:/Program Files/MiKTeX 2.9/miktex/bin/x64/lualatex.exe" did not succeed.
FATAL: No suitable temporary directory found.
FATAL: Data:
FATAL: Source: LibrariesMiKTeXCoreSessionmiktex.cpp:79
[2020-12-04 11:51:13,745] ERROR in testsheets: C:UsersUSERNA~1AppDataLocalTemptestsheet_oreb8wg5
[2020-12-04 11:51:13,745] ERROR in testsheets: Command '['c:/Program Files/MiKTeX 2.9/miktex/bin/x64/lualatex.exe', '--interaction=nonstopmode', 'tmpfk6un0c7.tex']' returned non-zero exit status 1.
Я пытаюсь понять, почему MiKTeX не может найти временный каталог при запуске из flask, но может при запуске из интерактивного сеанса.
Из того, что я вижу:
- Пользователь, выполняющий команду из приложения flask, такой же, как пользователь, выполняющий команду из интерактивного сеанса.
- У MiKTeX есть все пакеты, необходимые для сборки файла latex
- Команда подпроцесса не является проблемой
- Разрешения для временного каталога, похоже, в порядке
Комментарии:
1. Отправлено сообщение об ошибке в miktex, поскольку procmon, похоже, указывает мне, что проблема существует. github.com/MiKTeX/miktex/issues/666
Ответ №1:
Кажется, что оба TMP
и TEMP
существовали в subprocess
env, однако TMP
были установлены в пустую строку. MiKTeX использовался TMP
ранее TEMP
, поэтому он потерпел неудачу.
решил это так
subprocess.run(
[
current_app.config["LUALATEX_EXE"],
"--interaction=nonstopmode",
latexname,
],
cwd=build_dir,
check=True,
env=dict(os.environ, TMP=os.environ["TEMP"]),
)