我想创建一个python脚本,它可以将TEX文件转换为PDF,然后用我的文档查看器打开输出文件。
我首先尝试了以下方法:
import subprocess
subprocess.Popen(['xelatex', '--output-directory=Alunos/', 'Alunos/' + aluno + '_pratica.tex'], shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
subprocess.Popen(['gnome-open', 'Alunos/'+aluno+'_pratica.pdf'], shell=False)这样,从TEX到PDF的转换就可以正常工作,但由于需要一些时间,第二个命令(使用文档查看器打开文件)是在创建输出文件之前执行的。
所以,我试着让程序在执行第二个命令之前等待几秒钟。下面是我所做的:
import subprocess
import time
subprocess.Popen(['xelatex', '--output-directory=Alunos/', 'Alunos/' + aluno + '_pratica.tex'], shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
time.sleep(10)
subprocess.Popen(['gnome-open', 'Alunos/'+aluno+'_pratica.pdf'], shell=False)但是,当我这样做时,输出的PDF文件并没有被创建。我不明白为什么。唯一的变化是time.sleep命令。为什么它会影响Popen进程?有人能帮我一下吗?
编辑:
我听从了浮士德和保罗·布的建议,在这两种情况下,结果是相同的。
当我运行这个命令的时候...
subprocess.call('xelatex --output-directory=Alunos/ Alunos/{}_pratica.tex'.format(aluno), shell=True)..。或者这个..。
p = subprocess.Popen(['xelatex', '--output-directory=Alunos/', 'Alunos/' + aluno + '_pratica.tex'], shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.wait()...the Xelatex程序正在运行,但没有进行转换。
奇怪的是,当我直接在shell中运行该命令时...
$ xelatex --output-directory=Alunos/ Alunos/name_pratica.tex
..。转换工作得很完美。
下面是我运行subprocess.call()命令时得到的结果:
$ python my_file.py
Enter name:
name
This is XeTeX, Version 3.1415926-2.4-0.9998 (TeX Live 2012/Debian)
restricted \write18 enabled.
entering extended mode
(./Alunos/name_pratica.tex
LaTeX2e <2011/06/27>
Babel <v3.8m> and hyphenation patterns for english, dumylang, nohyphenation, loaded.
)
*当我直接在shell中编写命令时,输出是相同的,但后面会自动进行转换。有人知道为什么会这样吗?
PS:很抱歉我的格式化不好。我不知道如何正确地发布shell输出。
发布于 2014-01-05 22:27:36
如果您需要等待程序的终止,并且您对其输出不感兴趣,则应该使用subprocess.call
import subprocess
subprocess.call(['xelatex', '--output-directory=Alunos/', 'Alunos/{}_pratica.tex'.format(aluno)])
subprocess.call([('gnome-open', 'Alunos/{}_pratica.pdf'.format(aluno)])编辑:
此外,当您必须命名变量或函数时,使用英语通常是一件好事。
发布于 2014-01-06 03:33:49
如果xelatex命令在shell中有效,但在Python中调用它时失败,那么Python代码中的输出可能会阻塞xelatex。尽管将stdout/stderr设置为PIPE,您仍然无法读取管道。在我的机器上,管道缓冲区是64KB,因此,如果xelatex输出较小,那么它不应该阻塞。
您可以将输出重定向到os.devnull:
import os
import webbrowser
from subprocess import STDOUT, check_call
try:
from subprocess import DEVNULL # py3k
except ImportError:
DEVNULL = open(os.devnull, 'w+b')
basename = aluno + '_pratica'
output_dir = 'Alunos'
root = os.path.join(output_dir, basename)
check_call(['xelatex', '--output-directory', output_dir, root+'.tex'],
stdin=DEVNULL, stdout=DEVNULL, stderr=STDOUT)
webbrowser.open(root+'.pdf')check_call用于等待xelatex并在出错时引发异常。
https://stackoverflow.com/questions/20934669
复制相似问题