2016-05-13 7 views
1

私は自分で解決できない奇妙な問題があります。Python:例外をキャッチすることは、関数の外では機能しますが、関数内では機能しません。

Iは、2つの別々の端子に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) 

Iは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

ファイルを閉じたままにして、2つのスニペットが同じではないコードスニペットで、の外にtryがのところにありますが、まだファイルオブジェクトの参照がスリープコールが発生し、ロックファイル正当なエラーが発生します。関数内でスリープ状態を移動して関数を変更すると、これと同じようにコードが生成されます。

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

関連する問題