2013-06-28 16 views
2

我試圖創建一個文件。在這個文件中,我將需要處理的所有文件放在腳本中,並將該文件作爲參數傳遞。我的問題是,有時列表不夠長,無法填充緩衝區,也沒有任何內容寫入磁盤。我試圖刷新和fsync臨時文件,但沒有任何反應。腳本是第三方腳本,所以我無法改變參數傳遞的方式。Flush和fsync不能在臨時文件中工作

with tempfile.NamedTemporaryFile(bufsize=0) as list_file: 
    list_file.write("\n".join(file_list) + "\n") 
    list_file.flush() 
    os.fsync(list_file) 

    command = "python " + os.path.join(SCRIPT_PATH, SCRIPT_NAME) + " --thread --thread_file " 
    ppss_command = [SCRIPT_PATH + "/ppss", "-f", list_file.name, "-c", command] 
    p = subprocess.Popen(ppss_command) 
    out,err = p.communicate() 

最終解決代碼(jterrace答):

with tempfile.NamedTemporaryFile(delete=False) as list_file: 
    list_file.write("\n".join(file_list) + "\n") 
    list_file.close() 
    command = "python " + os.path.join(SCRIPT_PATH, SCRIPT_NAME) + " --thread --thread_file " 
    ppss_command = [SCRIPT_PATH + "/ppss", "-f", list_file.name, "-c", command] 
    p = subprocess.Popen(ppss_command) 
    out, err = p.communicate() 
    list_file.delete = True 
+0

你在窗戶上? – jterrace

回答

2

NamedTemporaryFile docstring

該名稱是否可以用來打開第二個時刻的文件,而 命名臨時文件仍處於打開狀態,因平臺而異(它可以是在Unix上使用的 ;它不能在Windows NT或更高版本上使用)。

因此,當您仍然打開文件時,可能無法從子流程中讀取文件。這是我會做的,而不是:

fd, tmp_fpath = tempfile.mkstemp() 
os.close(fd) # Needed on Windows if you want to access the file in another process 

try: 
    with open(tmp_fpath, "wb") as f: 
     f.write("\n".join(file_list) + "\n") 

    # ... subprocess stuff ... 
    do_stuff_with(tmp_fpath) 
finally: 
    os.remove(tmp_fpath) 
+0

我在unix系統(Ubuntu)上使用它,所以理論上我可以從另一個子進程讀取它。另外,當我使用大數據列表的腳本時,它可以正常工作。無論如何,如果我沒有辦法確保文件清空,我將使用您的方法。 – Nasgar

+0

fsync調用實際上是否工作?我希望你需要'os.fsync(list_file.fileno())' – jterrace

+0

我沒有任何線索fsync正在工作。我嘗試了os.fsync(list_file.fileno()),但沒有附加任何內容。當你說出並像魅力一樣工作時,我將文件關閉並最終將其擦除。非常感謝。 – Nasgar