使用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中的任何其他方式完成同样的事情,其中
我们可以锁定文件以进行访问
重启Python(因此不再拥有原始的Python文件对象或文件编号)。
解锁文件以便在新流程中进行访问。
我无法保存f
或file object
因此无法使用pickle
或其他内容。有没有办法使用Python标准库或一些win32api
调用?
任何Windows实用程序也会执行...来自Windows的任何命令行?
答案 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/filelocker(https://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),虽然最后选择是最复杂的