2014-01-05 87 views
0

我想製作一個python腳本,它將TEX文件轉換爲PDF格式,然後用我的文檔查看器打開輸出文件。Python subprocess.Popen()後跟time.sleep

我第一次嘗試以下操作:

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過程? 任何人都可以給我一些幫助嗎?

編輯:

我已經按照從浮士德和Paulo卜建議和在兩種情況下的結果是一樣的。

當我運行此命令

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() 

...的Xelatex程序運行,但不會進行轉換。

奇怪的是,當我直接在shell中運行命令

$ xelatex --output目錄= 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. 
) 
* 

當我直接寫命令的外殼,輸出是一樣的,但它通過轉換自動執行。 有誰知道爲什麼會發生這種情況? PS:抱歉的格式不對。我不知道如何正確發佈shell輸出。

+0

如果兩個步驟必須同步運行,爲什麼不把它們放在同一個過程中? –

+0

您沒有檢查第一條命令的結果。請檢測一個穩定的方法來了解它是否失敗。很可能它是子進程退出代碼; 'p.wait()'返回它。如果返回值不是0,轉換應該失敗。 – Netch

+0

你不能用bash腳本自動化這個嗎?看起來像完美的西裝。 –

回答

1

如果您需要等待程序的終止和你不感興趣,它的輸出你應該使用subprocess.call

import subprocess 
subprocess.call(['xelatex', '--output-directory=Alunos/', 'Alunos/{}_pratica.tex'.format(aluno)]) 
subprocess.call([('gnome-open', 'Alunos/{}_pratica.pdf'.format(aluno)]) 

編輯:

此外,它通常是使用英語的時候是好事你必須命名變量或函數。

+0

感謝您的幫助。 我只是做了你所說的,但它仍然不起作用。第一個命令打開Xelatex,但不會像創建Popen一樣創建輸出文件。有什麼想法嗎? – user2905179

0

如果xelatex命令在shell中工作,但在從Python中調用時失敗,那麼xelatex可能會在Python代碼中輸出時被阻塞。儘管將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和錯誤引發異常。