我在python中使用py2exe创建了一个可执行文件
我正在看这个post但不幸的是答案是肤浅的
使用Tendo的第一个解决方案,但这可以限制每个用户的1个应用程序实例,我的应用程序正在Windows Server环境中使用,一次有20个以上的用户。
提供的第二个解决方案Listening to a defined port没有示例说明如何实现它
所以我决定使用互斥锁来防止我的应用程序多次运行
所以我目前使用此code来使用互斥锁,但它在应用程序和服务之间没有互斥检测。
这个post显示了如何完成互斥锁,但没有显示它是如何在python中完成的。
我如何使用互斥锁在Windows上安装单个程序实例,其中互斥体不限制Windows上的单个程序实例,并且在应用程序和服务之间进行检测。
答案 0 :(得分:1)
我不确定您为什么必须在Windows上使用互斥锁来实现此目的?有一个更简单的选择:一个糟糕的旧锁文件。
如果要实现的 all 确保只运行应用程序的单个实例,则可以执行以下操作:
Windows支持您,因为如果文件被另一个进程打开,您将无法删除该文件。所以(代码未经测试):
tempdir = tempfile.gettempdir()
lockfile = os.sep.join([tempdir, 'myapp.lock'])
try:
if os.path.isfile(lockfile):
os.unlink(lockfile)
except WindowsError as e: # Should give you smth like 'WindowsError: [Error 32] The process cannot access the file because it is being used by another process..'
# there's instance already running
sys.exit(0)
with open(lockfile, 'wb') as lockfileobj:
# run your app's main here
main()
os.unlink(lockfile)
with
部分可确保在main
运行时打开文件,并在main
完成运行时关闭该文件。然后os.unlink
删除锁文件。
如果另一个实例尝试启动,它会在WindowsError
异常时退出(最好检查一下它的数字代码,但要确定它是否已经打开了文件)。 / p>
上面是一个粗略的解决方案,如果出于任何原因main
退出,则可以使用进入/退出功能删除锁定文件。这里的解释:http://effbot.org/zone/python-with-statement.htm