当前位置:  开发笔记 > 编程语言 > 正文

在Python中打开文件进行独占访问的最佳方法是什么?

如何解决《在Python中打开文件进行独占访问的最佳方法是什么?》经验,为你挑选了2个好方法。

解决这个问题最优雅的方法是什么:

打开一个文件进行阅读,但前提是它尚未打开才能写入

打开文件进行写入,但前提是它尚未打开进行读写

内置函数的工作方式如下

>>> 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).

解决方案应该在同一个进程中工作(如上例所示)以及另一个进程打开文件时.
如果崩溃程序不能保持锁定打开,则是首选.



1> Brian..:

我不认为有完全跨平台的方式.在unix上,fcntl模块将为您执行此操作.但是在Windows上(我假设你是路径),你需要使用win32file模块.

幸运的是,有一个可移植的实现(portalocker)在python cookbook上使用平台适当的方法.

要使用它,请打开该文件,然后调用:

portalocker.lock(file, flags)

其中flags是portalocker.LOCK_EX用于独占写访问,或LOCK_SH用于共享,读访问.


注意到PyPi上有更新的版本:http://pypi.python.org/pypi/portalocker
这使用Mark Hammond的"python for windows"扩展:http://starship.python.net/crew/mhammond/.如果它们不可用,您将在"import win32con"中收到错误消息.
@WimCoenen Anatoly Techtonik通过[porting](http://code.activestate.com/recipes/65203/#c10)portalocker删除了对该模块的依赖.
Portalocker有很多奇怪之处.它不会像你想象的那样工作.例如,如果在文件打开模式下使用`portalocker.Lock()`打开文件,包括`'w'`,则在测试锁之前将截断该文件.锁定是一个难题.Portalocker并没有真正解决它.在依赖门户网站代码之前,请务必先阅读它们.

2> Federico A. ..:

解决方案应该在同一个进程中工作(如上例所示)以及另一个进程打开文件时.

如果通过"另一个进程",你的意思是"无论什么进程"(即不是你的程序),在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也无法读取文件.

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有