锁定文件以便在Windows上访问

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中的任何其他方式完成同样的事情

  1. 我们可以锁定文件以进行访问

  2. 重新启动Python(因此不再具有原始Python文件对象或文件编号).

  3. 解锁文件以便在新进程中进行访问.

我无法保存ffile object不能使用pickle或其他任何东西.有没有办法使用Python标准库或一些win32api调用?
任何Windows实用程序也会执行...来自Windows的任何命令行?

Mar*_*ers 5

您似乎想要锁定对程序调用之间锁定持久存在的资源的访问.你需要一个不同的策略.

使用独占创建模式创建锁定文件; 在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中的单独步骤,该步骤将打开另一个程序创建锁的窗口.

现在,您无需跟踪文件描述符即可锁定和解锁.锁文件现在是一个信号文件 ; 如果它存在某些东西声称锁定,并删除该文件意味着某些东西被解锁.

这意味着只能保护对您要保护的文件或目录的访问权限,因为您的所有代码都遵循此锁定系统,而不是因为操作系统对这些文件或目录强制执行锁定.

这意味着只有在共享资源的所有访问都由此策略中合作的进程处理时,这才有效.如果另一个进程不遵守此方案,则不能使用它.在这种情况下,您唯一的选择是使用操作系统级锁定,并且您必须在整个锁定期间保持您的进程运行.

  • 从纯粹自私的角度来看,如果你将赏金奖励给我,我当然会更喜欢*.我确实发现了你的问题,因为你发了一笔赏金,而且由于有机会赢得奖金,我有一定的动机去写答案.:-)但你如何奖励它取决于你; 您无法获得的唯一选择是赏金退款. (2认同)