2011-09-09 101 views
0

我想使用Python構建一個LaTeX文檔,但在順序運行命令時遇到問題。對於那些熟悉LaTeX的人,你會知道你通常必須運行四個命令,每個命令在運行下一個命令之前完成。從Python運行命令序列

pdflatex file 
bibtex file 
pdflatex file 
pdflatex file 

在Python,我因此這樣做是爲了定義的命令

commands = ['pdflatex','bibtex','pdflatex','pdflatex'] 
commands = [(element + ' ' + src_file) for element in commands] 

但隨後的問題是運行它們。

我試過把事情從this thread –例如在循環中使用os.system()subprocess東西一樣map(call, commands)Popen,和摺疊列表,通過& –分隔的單個字符串,但它似乎像所有的運行爲單獨的進程的命令,而無需等待前一個完成。

爲了記錄,我在Windows上,但想要一個跨平臺的解決方案。

編輯
該問題是指定src_file變量的bug;它不應該有一個「.tex」。下面的代碼現在工作:

test.py

import subprocess 

commands = ['pdflatex','bibtex','pdflatex','pdflatex'] 

for command in commands: 
    subprocess.call((command, 'test')) 

test.tex

\documentclass{article} 
\usepackage{natbib} 

\begin{document} 
This is a test \citep{Body2000}. 
\bibliographystyle{plainnat} 
\bibliography{refs} 
\end{document} 

refs.bib

@book{Body2000, 
    author={N.E. Body}, 
    title={Introductory Widgets}, 
    publisher={Widgets International}, 
    year={2000} 
} 
+1

如果使用[接受來自該線程的答案](http://stackoverflow.com/questions/359347/execute-commands-sequentially- in-python/359506#359506)使用[Popen.wait()](http://docs.python.org/library/subprocess.html?highlight=subprocess#subprocess.Popen.wait),這應該工作。 – crashmstr

+0

我認爲這看起來很有前途,但說實話,我並不真正遵循代碼示例。對於一個簡單的任務來說,2個類似乎很多代碼。 – jkeirstead

+0

[來自utdemir的答案](http://stackoverflow.com/questions/7365319/run-commands-sequential-from-python/7365350#7365350)更簡單。但是調用與Popen(...)非常相似,然後在返回的對象上調用wait()。 – crashmstr

回答

5

os.system應該不會造成這一點,但subprocess.Popen應。

但我認爲使用subprocess.call是最好的選擇:

commands = ['pdflatex','bibtex','pdflatex','pdflatex'] 

for command in commands: 
    subprocess.call((command, src_file)) 
+0

不是 - 它不會按順序運行它們。 LaTeX文檔仍缺少交叉引用。 (我用手動編譯檢查了源文件。) – jkeirstead

+0

它應該。代碼中必須存在另一個問題。 – utdemir

+0

你是對的!在src_file字符串中具有'tex'擴展名會破壞bibtex編譯。我已經添加了上面的更改。 – jkeirstead