2013-09-23 29 views
0

我在python打開的文件用下面的代碼,爲什麼Windows命令Processor在python中打開文件後退出?

s=subprocess.Popen(fileName,shell=True) 
s.wait() 
os.remove(fileName) 

是否文件被關閉與否,它直接跳到o​​s.remove(),通過該時間文件未關閉。因此得到以下例外。

WindowsError: [Error 32] The process cannot access the file because it is being used by another process 

上述問題是發生在其他機器,但在我的機器,直到文件被關閉碼流不來os.remove()

我怎樣才能讓subprocess.Popen()應等到文件關閉。

+1

你可能想'os.startfile(文件名)'或'webbrowser.open(文件名)'代替。你也可以明確地指定相關的程序:'subprocess.check_call([program,filename])' – jfs

+0

嗨J.F. Sebastian,我嘗試了os.startfile(filename)和webbrowser.open(filename)兩種方式。有了這兩種方式文件打開,但在這裏,我們無法追蹤文件何時關閉。使用subprocess.check_call([program,filename])我們可以打開文件,並且我們也可以在文件關閉時跟蹤事件。這是在我的系統中工作,但在其他機器我無法跟蹤文件關閉事件 –

回答

0

我在不同的方式嘗試如下,

def removeTempFile(tempFileName): 
    f = None 
    while f == None: 
    try: 
     f=open(tempFileName,'w') 
     f.close() 
    except Exception as e: 
     print "already open" 
     f=None 
     time.sleep(2) 

os.remove(tempFileName) 
0

不知道fileName的值這是一個猜測,但我相信你的問題是你正在等待shell退出,但shell啓動另一個進程來打開文件,並不等待該過程退出。

例如,如果您嘗試以這種方式打開Excel電子表格,那麼shell將查找註冊表並確定打開電子表格的方式是使用命令行標誌來運行Excel(如果尚未運行)它創建一個空白工作表,然後發送一個DDE命令告訴它打開工作表。然後shell會退出,您的wait完成,但該文件仍處於打開狀態(或者甚至可能尚未打開)。

如果您想等待完成,至少需要運行打開文件的實際命令,而不依賴於shell的自動查找。如果應用程序已經在運行,那麼這可能還不夠,因爲有些應用程序可能會檢測到現有的實例,所以如果應用程序尚未運行,您的等待纔會起作用。

有可能沒有任何簡單的乾淨的方式來做你想做的。我建議的最好的方法是,如果os.remove()調用失敗,則使用輪詢循環,休眠1秒鐘然後重試,但如果在調用wait()完成時文件尚未打開,您可能仍會遇到問題。

0

也許你可以嘗試這樣的事情:

s=subprocess.Popen(fileName,shell=True) 

while True: 
    try: 
     os.remove(filename) 
     break 
    except(WindowsError): 
     time.sleep(1) # wait 1 second 

.... 

該段應反覆嘗試關閉文件。如果它出現windows錯誤,它會在再次嘗試之前等待一秒。

相關問題