vks*_*vks 0 python windows python-2.7
使用portalocker我们可以通过以下方式锁定文件以进行访问:
f=open("M99","r+")
portalocker.lock(f,portalocker.LOCK_EX)
Run Code Online (Sandbox Code Playgroud)
将lock在该文件可以使用删除
f.close() #or
portalocker.unlock(file) #needs `file` ie reference to file it locked ..pretty obvious too
Run Code Online (Sandbox Code Playgroud)
可以通过python中的任何其他方式完成同样的事情
我们可以锁定文件以进行访问
重新启动Python(因此不再具有原始Python文件对象或文件编号).
解锁文件以便在新进程中进行访问.
我无法保存f或file object不能使用pickle或其他任何东西.有没有办法使用Python标准库或一些win32api调用?
任何Windows实用程序也会执行...来自Windows的任何命令行?
您似乎想要锁定对程序调用之间锁定持久存在的资源的访问.你需要一个不同的策略.
使用独占创建模式创建锁定文件; 在Python 2中,这需要使用os.open()调用(后跟os.fdopen()生成Python文件对象),在Python 3中,您可以'x'在使用内置时使用该模式open().
在Python 2中:
import os
LOCKFILE = r'some\path\to\lockfile'
class AlreadyLocked(Exception):
pass
def lock():
try:
fd = os.open(LOCKFILE, os.O_WRONLY | os.O_CREAT | os.O_EXCL)
except IOError:
# file already exists
raise AlreadyLocked()
with os.fdopen(fd, 'w') as lockfile:
# write the PID of the current process so you can debug
# later if a lockfile can be deleted after a program crash
lockfile.write(os.getpid())
def unlock():
os.remove(LOCKFILE)
Run Code Online (Sandbox Code Playgroud)
在Python 3中,lock()函数将是:
def lock():
try:
with open(LOCKFILE, 'x') as lockfile:
# write the PID of the current process so you can debug
# later if a lockfile can be deleted after a program crash
lockfile.write(os.getpid())
except IOError:
# file already exists
raise AlreadyLocked()
Run Code Online (Sandbox Code Playgroud)
您需要使用独占创建模式来避免竞争条件; 在独占创建模式下,只有在文件尚不存在的情况下才能创建该文件,这是操作系统检查的条件,而不是Python中的单独步骤,该步骤将打开另一个程序创建锁的窗口.
现在,您无需跟踪文件描述符即可锁定和解锁.锁文件现在是一个信号文件 ; 如果它存在某些东西声称锁定,并删除该文件意味着某些东西被解锁.
这意味着只能保护对您要保护的文件或目录的访问权限,因为您的所有代码都遵循此锁定系统,而不是因为操作系统对这些文件或目录强制执行锁定.
这意味着只有在共享资源的所有访问都由此策略中合作的进程处理时,这才有效.如果另一个进程不遵守此方案,则不能使用它.在这种情况下,您唯一的选择是使用操作系统级锁定,并且您必须在整个锁定期间保持您的进程运行.
| 归档时间: |
|
| 查看次数: |
3755 次 |
| 最近记录: |