2016-07-08 37 views
2

我期望創建一個目錄,然後在其中打開一個文件以供寫入,當我在下面執行我的代碼時Python的2.6.6,創建目錄然後在Python中打開文件時出現錯誤,但是如果目錄已經存在則沒有錯誤

import subprocess 

def create_output_dir(work_dir): 
    output_dir = '/work/m/maxwell9/some_name5/' 
    subprocess.Popen(['mkdir', output_dir]) 
    return output_dir 

if __name__ == '__main__': 
    work_dir = '/work/m/maxwell9/' 
    output_dir = create_output_dir(work_dir) 
    #output_dir = '/work/m/maxwell9/some_name5/' 
    filename = output_dir + 'bt.sh' 
    with open(filename, 'w') as script: 
     print('there') 

,而是我得到的錯誤,

Traceback (most recent call last): 
    File "slurm_test.py", line 13, in <module> 
    with open(filename, 'w') as script: 
IOError: [Errno 2] No such file or directory: '/work/m/maxwell9/some_name5/bt.sh' 

如果我運行該腳本,然後我可以看到目錄中創建。如果我再取消註釋行,

#output_dir = '/work/m/maxwell9/some_name5/' 

和註釋行,

output_dir = create_output_dir(work_dir) 

則該文件輸出的罰款。所以有一些關於創建文件夾,然後寫入到導致錯誤的相同腳本中。

回答

5

subprocess.Popen啓動一個外部進程,但不會等待它完成,除非您告訴它(例如通過在返回的Popen實例上調用.wait)。很可能,mkdir正在創建目錄,而open(filename, 'w')嘗試在該目錄中創建文件。這是一個"race condition"的示例。

的解決方案是.wait就開處理(如上所述),或者可以完全由使用os.mkdiros.makedirs使用便利包裝subprocess.check_outputsubprocess.check_call或(更好)之一,則可避免subprocess

1

您可以使用os庫而不是subprocess,這使得更直接的實現。嘗試換掉create_output_dir功能與此:

import os 

def create_output_dir(work_dir): 
    try: 
     os.makedirs(work_dir) 
    except OSError: 
     pass 

    return work_dir 
+1

你可能最好使用'嘗試:os.makedirs(WORK_DIR);除了OSError:通過'而不是'os.path.isdir'(避免另一個小的競態條件)。 – mgilson

+0

@mgilson好建議,編輯! – Alec

相關問題