我有一种检查点文件,我希望有时可以通过各种python程序进行修改。我加载文件,尝试使用portalocker锁定它,更改它,然后解锁并关闭它。
但是,portalocker在最简单的情况下不起作用。 我创建了一个简单的文件:
$echo "this is something here" >> test
$python
Python 3.5.2 (default, Jul 5 2016, 12:43:10)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import portalocker
>>> f = open("test",'w')
>>> portalocker.lock(f, portalocker.LOCK_EX)
同时我仍然可以在另一个终端打开它:
$python
Python 3.5.2 (default, Jul 5 2016, 12:43:10)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> fl = open("test",'w')
>>> fl.write("I can still overwrite this\n")
>>> fl.close()
然后我关闭第一个,并检查文件:
>>> portalocker.unlock(f)
>>> f.close()
>>>
$ cat test
I can still overwrite this
我做错了什么?
答案 0 :(得分:4)
问题在于,默认情况下,Linux使用咨询锁。 To enable mandatory locking (which you are referring to) the filesytem needs to be mounted with the mand
option。咨询锁定系统实际上有几个优点,但如果你不期待它可能会令人困惑。
为了确保您的代码在两种情况下都能正常运行,我建议用锁定器封装两个打开的调用。
例如,在2个单独的Python实例中尝试:
import portalocker
with portalocker.Lock('test') as fh:
fh.write('first instance')
print('waiting for your input')
input()
现在来自第二个实例:
import portalocker
with portalocker.Lock('test') as fh:
fh.write('second instance')
Ps:我是portalocker软件包的维护者