2013-10-08 130 views
2

我有一個Python腳本,它調用一個Perl腳本來分析一些文件並生成輸出文件。再次使用Python腳本將這些輸出文件上傳到MySQL數據庫。 Perl腳本大約需要5-7 mins來解析一些文件並生成Python用來上傳的輸出文件。從Python腳本調用Perl時,Perl沒有完全執行

的Python腳本是這樣的:

import subprocess 
pipe = subprocess.Popen(["perl", "./parser.pl"], stdin=subprocess.PIPE) 
pipe.stdin.close() 

#Now, load the output files from parser.pl to database. 

sql01 = """LOAD DATA LOCAL INFILE 'sequence.parsed' INTO TABLE nasequenceimp FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n';""" 

try: 
    c.execute(sql01) 
    conn.commit() 
except StandardError, e: 
    print e 
    conn.rollback() 

但是,似乎Python腳本被終止,Perl腳本將繼續解析文件。因此,Python發現錯誤sequence.parsed does not exist

爲什麼Python腳本不等待Perl完成執行?

+0

@mpapec,在這個問題中添加我的Perl代碼的範圍是什麼。在投票前你有沒有讀過我的問題? – aki2all

+0

剛剛刪除了Perl標記,沒有投下你的問題.. –

回答

3

父進程默認情況下不會等待由subprocess.Popen產生的子進程。您應該致電:

pipe.wait() 

之後subprocess.Popen。它會等待子進程終止並讓你的python腳本繼續。您可以使用os.system()代替。

+0

我應該在'pipe.wait()'後面加上'pipe.stdin.close()'嗎? – aki2all

+0

@ aki2all'pipe.wait()'會阻止你的python腳本,所以你應該把它放在'pipe.stdin.close()'之後。 –

+0

幫了很多..代碼現在工作正常.. – aki2all