2016-09-19 43 views
1

我有一個錯誤,我一直不斷遇到,可悲的是無法找到解決方案在網站上。順序使用mkdir和觸摸子進程不起作用

try: 
    #create working dir if it doens't exist already 
    if not os.path.isdir(WORKINGDIR): 
     print '>>>mdkir ',WORKINGDIR 
     subprocess.Popen(['mkdir',WORKINGDIR]).wait() 
     print os.path.isdir(WORKINGDIR) 

    #create output csv file 
    outputCSVFile = WORKINGDIR+ '/'+'results.csv' 
    if not os.path.isfile(outputCSVFile): 
     print '>>> touch',outputCSVFile 
     subprocess.check_output(['touch',outputCSVFile]) 

雖然行:始終打印Truesubprocess返回此錯誤:

touch: cannot touch `/nfs/iil/proj/mpgarch/archive_06/CommandsProfiling/fastScriptsOutput190916/results.csv': No such file or directory

,當我用subprocess.checkoutput代替subprocess.Popen().wait()同樣的錯誤不會出現。 我知道這個問題可以通過很多方式解決(例如使用os方法來創建目錄和文件),但我對我的方式不工作的原因感興趣。

在此先感謝。

編輯:如一些建議,問題可能在於事實上,該程序在subprocess.Popen之後繼續太快,因此使用subprocess.checkoutput解決該問題可能較慢(因爲它必須等待輸出)。但仍然 - 我不明白究竟發生了什麼,因爲os.path.istdir表明該dir創建,繼續執行該行之前touch

+1

我能想到的唯一的事情是由沿線某處緩存中的競爭條件。也許目錄創建延遲了幾分之一秒。也許通過'subprocess.checkoutput'產生的輸出流造成足夠的延遲,導致目錄被創建。簡單的檢查就是在破損的版本中添加一個有意的等待,看看是否能修復它。當然,我不能肯定地說這些方法不是以不同的方式調用shell,而是遇到了一個邊緣情況。希望有更多知識淵博的人可以選擇一個 – Basic

+0

我相信你是對的,而這正是導致它的原因。 – DorHugi

回答

0

我想你有文件權限問題。 在你的路徑中,看起來你正在使用NFS。你已經在本地文件系統上試過了嗎?

無論如何,你應該避免使用子進程進行簡單的文件操作。

要創建一個目錄:

if not os.path.exists(WORKINGDIR): 
    os.makedirs(WORKINGDIR) 

對於觸摸:

import os 

def touch(fname, times=None): 
    with open(fname, 'a'): 
     os.utime(fname, times) 

touch(WORKINGDIR+ '/'+'results.csv') 
+0

謝謝你的幫助。恐怕這裏的權限不是問題。您可以看到成功創建的目錄,並且在創建目錄之前或使用subprocess.check_output()時,touch命令正常工作。我感興趣的是爲什麼我的代碼與Popen無法正常工作。 – DorHugi

相關問題