锁定文件以便在Windows上访问

时间:2015-03-30 10:55:46

标签: python windows python-2.7

使用portalocker我们可以通过以下方式锁定文件以进行访问:

f=open("M99","r+")
portalocker.lock(f,portalocker.LOCK_EX)

可以使用

删除文件上的lock
f.close()  #or
portalocker.unlock(file)   #needs `file` ie reference to file it locked ..pretty obvious too

可以通过python中的任何其他方式完成同样的事情,其中​​

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

  2. 重启Python(因此不再拥有原始的Python文件对象或文件编号)。

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

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

3 个答案:

答案 0 :(得分:5)

您似乎希望锁定对程序调用之间锁定的资源的访问权限。你需要一个不同的策略。

使用独占创建模式创建锁定文件;在Python 2中,这需要使用os.open() call(后跟os.fdopen()来生成Python文件对象),在Python 3中,您可以在使用内置{{1}时使用'x'模式}}

在Python 2中:

open()

在Python 3中,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) 函数将是:

lock()

您需要使用独占创建模式以避免竞争条件;在独占创建模式下,只有在文件尚不存在的情况下才能创建文件,操作系统检查该条件,而不是通过Python中的单独步骤创建文件,这将打开另一个程序创建锁的窗口

现在您可以在不跟踪文件描述符的情况下锁定和解锁。锁文件现在是信号文件;如果它存在某些东西声称锁定,删除该文件意味着某些东西被解锁。

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

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

答案 1 :(得分:1)

如果您阅读了以下内容,win32api中有一个设置文件属性的方法:
python SetFileAttributes
MSDN file attributes

这些为您提供了设置文件属性的python方法:
win32api.SetFileAttributes(file,win32con.FILE_ATTRIBUTE_NORMAL) 其中file是文件的名称/路径,而不是文件对象 第二个参数是属性掩码,你想一次设置几个属性,你可以使用按位xor来添加它们:
win32con.FILE_ATTRIBUTE_HIDDEN | win32con.FILE_ATTRIBUTE_READONLY

并且MSDN页面中有更多常量。

编辑: 对于文件锁定,您还可以查看win32file.LockFileEx方法

我以前没有使用它,所以可能需要一些游戏,但它似乎需要你传递一个文件对象(不是路径),然后是某些常量来设置访问权限,更多信息常量可以在MSDN

上找到

答案 2 :(得分:1)

您可以使用子流程在记事本或excel中打开文件:

import subprocess, time

subprocess.call('start excel.exe "\lockThisFile.txt\"', shell = True)

time.sleep(10) # if you need the file locked before executing the next commands, you may need to sleep it for a few seconds

subprocess.call('notepad > lockThisFile.txt', shell = True)

如上所述,你需要shell = True,否则windows会给你一个语法错误。

(subprocess.Popen()也可以)

然后您可以使用以下方法关闭该过程:

subprocess.call('taskkill /f /im notepad.exe') # or excel.exe

其他选项包括

- 编写一些C ++代码并从python(https://msdn.microsoft.com/en-us/library/windows/desktop/aa365203(v=vs.85).aspx

中调用它

- 使用subprocess.call()调用第三方程序:

FileLocker http://www.jensscheffler.de/filelockerhttps://superuser.com/questions/294826/how-to-purposefully-exclusively-lock-a-file

Easy File Locker http://www.xoslab.com/efl.html和Dispatch(来自win32com.client import Dispatch),虽然最后选择是最复杂的