2016-05-13 72 views
1

我有一個奇怪的問題,我無法解決自己。Python:捕捉異常在函數外部工作,但不在函數內

如果我執行需要兩個單獨的outside_func.py端子,第二執行捕捉BlockingIOError異常並打印消息:

outside_func.py

import fcntl 
import time 

# Raise BlockingIOError if same script is already running. 
try: 
    lockfile = open('lockfile', 'w') 
    fcntl.flock(lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB) 
except BlockingIOError: 
    print('Script already running.') 

time.sleep(20) 

如果我做相同的inside_func.py沒什麼被捕獲並且沒有消息被打印:

inside_func.py

import fcntl 
import time 

# Raise BlockingIOError if same script is already running. 
def script_already_running(): 
    try: 
     lockfile = open('lockfile', 'w') 
     fcntl.flock(lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB) 
    except BlockingIOError: 
     print('Script already running.') 

script_already_running() 

time.sleep(20) 

任何想法?

+2

郵編能重現問題。 –

+2

聽起來像一個問題,你在發佈的代碼之外改變的東西,你沒有意識到是非常重要的。 – user2357112

+0

我更新了例子。現在問題應該是可重現的。 – Rotareti

回答

1

當您離開函數時文件會關閉,因此兩個片段不相同,在代碼片段中,嘗試是以外的函數仍然存在對該文件對象的引用睡眠呼叫等進一步調用打開鎖文件正確的錯誤。如果您通過移動睡在函數內部改變功能,你會看到錯誤引發的,現在你有可比性代碼:

import fcntl 
import time 

# Raise BlockingIOError if same script is already running. 
def script_already_running(): 
    try: 
     lockfile = open('lockfile', 'w') 
     fcntl.flock(lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB) 
    except BlockingIOError: 
     print('except') 
    sleep(20) 
+0

你有什麼想法如何修復這個函數來保持'flock' * alive *? – Rotareti

+0

我知道了:)我讓函數返回'lockfile',這似乎解決了這個問題。 – Rotareti