我有一個錯誤,我一直不斷遇到,可悲的是無法找到解決方案在網站上。順序使用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])
雖然行:始終打印True
,subprocess
返回此錯誤:
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
我能想到的唯一的事情是由沿線某處緩存中的競爭條件。也許目錄創建延遲了幾分之一秒。也許通過'subprocess.checkoutput'產生的輸出流造成足夠的延遲,導致目錄被創建。簡單的檢查就是在破損的版本中添加一個有意的等待,看看是否能修復它。當然,我不能肯定地說這些方法不是以不同的方式調用shell,而是遇到了一個邊緣情況。希望有更多知識淵博的人可以選擇一個 – Basic
我相信你是對的,而這正是導致它的原因。 – DorHugi