解决这个问题最优雅的方法是什么:
打开一个文件进行阅读,但前提是它尚未打开才能写入
打开文件进行写入,但前提是它尚未打开进行读写
内置函数的工作方式如下
>>> path = r"c:\scr.txt" >>> file1 = open(path, "w") >>> print file1>>> file2 = open(path, "w") >>> print file2 >>> file1.write("111") >>> file2.write("222") >>> file1.close()
scr.txt现在包含'111'.
>>> file2.close()
scr.txt被覆盖,现在包含'222'(在Windows上,Python 2.4).
解决方案应该在同一个进程中工作(如上例所示)以及另一个进程打开文件时.
如果崩溃程序不能保持锁定打开,则是首选.
我不认为有完全跨平台的方式.在unix上,fcntl模块将为您执行此操作.但是在Windows上(我假设你是路径),你需要使用win32file模块.
幸运的是,有一个可移植的实现(portalocker)在python cookbook上使用平台适当的方法.
要使用它,请打开该文件,然后调用:
portalocker.lock(file, flags)
其中flags是portalocker.LOCK_EX用于独占写访问,或LOCK_SH用于共享,读访问.
解决方案应该在同一个进程中工作(如上例所示)以及另一个进程打开文件时.
如果通过"另一个进程",你的意思是"无论什么进程"(即不是你的程序),在Linux中,没有办法只在系统调用(fcntl和朋友)上实现这一点.你想要的是强制锁定,并且获取它的Linux方式更复杂:
使用mand选项重新安装包含文件的分区:
# mount -o remount,mand /dev/hdXY
为您的文件设置sgid标志:
# chmod g-x,g+s yourfile
在Python代码中,获取该文件的独占锁:
fcntl.flock(fd, fcntl.LOCK_EX)
现在,即使你释放锁定,cat也无法读取文件.