我有两个应用程序(从python编译,仅在Windows上运行)。第一个是计划好的:它启动,启动另一个应用程序的几个实例,然后死亡。此外,此计划的应用程序应检查以前启动的子应用程序实例是否仍在运行。在
为了实现此检查,我尝试使用文件锁定方法:在子应用程序中创建文件并对其进行显式锁定。万一
应用程序崩溃锁应该自动释放。在
从中检查此文件
预定应用程序。如果它被锁定-这意味着子应用程序仍然
跑步。在
这在PERL中很容易实现,但我在python中遇到了一些问题。在
我尝试使用win32 API(从portalocker中剪切所需的部分代码)。在
以下是测试脚本:import os
import win32con
import win32file
import pywintypes
import sys
import time
import threading
def createLockFile(filePath = "c:\\\\test.tmp"):
file = open(filePath, "a+")
hfile = win32file._get_osfhandle(file.fileno())
win32file.LockFileEx(hfile, win32con.LOCKFILE_EXCLUSIVE_LOCK, 0, -0x10000, pywintypes.OVERLAPPED())
def lockFile(filePath = "c:\\\\test.tmp"):
t = threading.Thread(target=createLockFile, args=(filePath,))
t.start()
def checkFileLock(filePath = "c:\\\\test.tmp"):
log = open(filePath, "a+")
#here should be IOError: [Errno 13] in case of error
print 'File is not locked'
def go():
print 'start'
lockFile()
print 'file locked'
print 'sleeping'
time.sleep(30)
print 'getting up'
我打开pythonshell的两个实例并导入这个脚本。
然后我在其中一个文件中启动go()方法,当它处于休眠状态时,我启动checkFileLock()函数来检查文件是否确实被锁定。。。但事实并非如此。在
我也试图离开系统标准读入线就像在portalocker中完成的一样,在这种情况下,文件实际上是被锁定的。但是在我的应用程序中没有必要听stdin。。。在
所以我在创建锁的线程中创建了无限循环。在这种情况下,文件也被锁定,但即使在我关闭pythonshell之后也没有释放它,这也是不正确的。在
我将非常高兴听到如何解决在Windows中从Python锁定文件的问题。
如果你有任何其他的工作方法,如何确切地知道进程是否仍在运行,我也想听听。在