1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| __all__ = [ 'os_lock' ]
# ce qu'on fait dans le cas UNIX, OSX, Linux...
def get_ux_lock():
from fcntl import lockf, LOCK_NB, LOCK_EX
def os_lock(file, range=80):
return lockf(file.fileno(), LOCK_EX | LOCK_NB, range, 1)
return os_lock
# ce qu'on fait dans le cas Windows
def get_w32_lock():
from msvcrt import locking, LK_NBLCK, LK_UNLCK
def os_lock(file, range=80):
return locking(file.fileno(), LK_NBLCK, range)
return os_lock
# une facon comme une autre de s'assurer que les bons modules sont la
# plutot que de tester sys.platform... le tout ne servant qu'à definir os_lock
# dans global avec la definition qui va bien.
try:
import fcntl
except:
pass
else:
os_lock = get_ux_lock()
if 'os_lock' not in globals():
try:
import msvcrt
except:
pass
else:
os_lock = get_w32_lock()
# dans le cas ou ce n'est pas si portable...
assert 'os_lock' in globals(), 'unable to define os_lock routine'
# quand je suis ici, j'ai ce qu'il faut dans os_lock...
# le suite ne fait que "tester"
# pour faire planter, yaka lancer python ailleurs et faire:
# >>> from portalocker import os_lock
# >>> f = open('test.lock', 'r+')
# >>> os_lock(f)
# avant de lancer ce qui suit...
if __name__ == '__main__':
import os
fname = 'test.lock'
if not os.path.exists(fname):
open(fname, 'w').close()
myLock = open(fname, 'r+')
os_lock(myLock)
print 'Bye' |
Partager