2013-10-30 84 views
6

我已经做了一些python函数来编译传递的字符串为pdf使用latex的文件。该功能按预期工作并且非常有用,因此我寻找改进它的方法。从python编译胶乳

,我有代码:

def generate_pdf(pdfname,table): 
    """ 
    Generates the pdf from string 
    """ 
    import subprocess 
    import os 

    f = open('cover.tex','w') 
    tex = standalone_latex(table) 
    f.write(tex) 
    f.close() 

    proc=subprocess.Popen(['pdflatex','cover.tex']) 
    subprocess.Popen(['pdflatex',tex]) 
    proc.communicate() 
    os.unlink('cover.tex') 
    os.unlink('cover.log') 
    os.unlink('cover.aux') 
    os.rename('cover.pdf',pdfname) 

与代码的问题是,它创造一堆名为在事后被删除工作目录中的文件。

如何避免在工作目录下创建不需要的文件?

解决方案

def generate_pdf(pdfname,tex): 
""" 
Genertates the pdf from string 
""" 
import subprocess 
import os 
import tempfile 
import shutil 

current = os.getcwd() 
temp = tempfile.mkdtemp() 
os.chdir(temp) 

f = open('cover.tex','w') 
f.write(tex) 
f.close() 

proc=subprocess.Popen(['pdflatex','cover.tex']) 
subprocess.Popen(['pdflatex',tex]) 
proc.communicate() 

os.rename('cover.pdf',pdfname) 
shutil.copy(pdfname,current) 
shutil.rmtree(temp) 
+0

您可以在您创建的文件夹中构建您的pdf,完成后移出pdf并递归删除文件夹。 – Theolodis

+1

这些文件不是不需要的,它们被“latex”使用。你不能创建它们,你只能像现在这样去除它们(或者用当前目录指向''tempfile.mkdtemp()'')来运行这个过程。 – fjarri

+0

'LaTeX'需要这些文件才能运行。请参阅[这个问题](http://tex.stackexchange.com/questions/11123/prevent-pdflatex-from-writing-a-bunch-of-files)TEX.SX – darthbith

回答

8

使用的临时目录。临时目录总是可写的,可以在重新启动后由操作系统清除。 tempfile库允许您以安全的方式创建临时文件和目录。

path_to_temporary_directory = tempfile.mkdtemp() 
# work on the temporary directory 
# ... 
# move the necessary files to the destination 
shutil.move(source, destination) 
# delete the temporary directory (recommended) 
shutil.rmtree(path_to_temporary_directory) 
+0

似乎是一个好开始。移动到目的地是如何完成的? –

+0

看看'shutil'库。我在答案中包含了相关的电话。 –