2013-10-30 268 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'庫。我在答案中包含了相關的電話。 –