首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python subprocess.Popen(),后跟time.sleep

Python subprocess.Popen(),后跟time.sleep
EN

Stack Overflow用户
提问于 2014-01-05 22:23:44
回答 2查看 3.7K关注 0票数 0

我想创建一个python脚本,它可以将TEX文件转换为PDF,然后用我的文档查看器打开输出文件。

我首先尝试了以下方法:

代码语言:javascript
复制
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的转换就可以正常工作,但由于需要一些时间,第二个命令(使用文档查看器打开文件)是在创建输出文件之前执行的。

所以,我试着让程序在执行第二个命令之前等待几秒钟。下面是我所做的:

代码语言:javascript
复制
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进程?有人能帮我一下吗?

编辑:

我听从了浮士德和保罗·布的建议,在这两种情况下,结果是相同的。

当我运行这个命令的时候...

代码语言:javascript
复制
subprocess.call('xelatex --output-directory=Alunos/ Alunos/{}_pratica.tex'.format(aluno), shell=True)

..。或者这个..。

代码语言:javascript
复制
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()命令时得到的结果:

代码语言:javascript
复制
$ 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输出。

EN

回答 2

Stack Overflow用户

发布于 2014-01-05 22:27:36

如果您需要等待程序的终止,并且您对其输出不感兴趣,则应该使用subprocess.call

代码语言:javascript
复制
import subprocess
subprocess.call(['xelatex', '--output-directory=Alunos/', 'Alunos/{}_pratica.tex'.format(aluno)])
subprocess.call([('gnome-open', 'Alunos/{}_pratica.pdf'.format(aluno)])

编辑:

此外,当您必须命名变量或函数时,使用英语通常是一件好事。

票数 1
EN

Stack Overflow用户

发布于 2014-01-06 03:33:49

如果xelatex命令在shell中有效,但在Python中调用它时失败,那么Python代码中的输出可能会阻塞xelatex。尽管将stdout/stderr设置为PIPE,您仍然无法读取管道。在我的机器上,管道缓冲区是64KB,因此,如果xelatex输出较小,那么它不应该阻塞。

您可以将输出重定向到os.devnull

代码语言:javascript
复制
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并在出错时引发异常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20934669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档