我在python中使用py2exe创建了一个可执行文件。
我正在看这篇文章,但不幸的是答案是肤浅的。
使用Tendo的第一个解决方案,但这适用于限制每个用户1个应用程序实例,并且我的应用程序正在一次登录20 +用户的Windows服务器环境中使用。
提供的第二个解决方案侦听定义的端口没有如何完成的示例。
所以我决定使用互斥锁来防止我的应用程序多次运行。
所以我目前使用此代码来使用互斥锁,但它在应用程序和服务之间没有互斥体检测。
这篇文章展示了如何完成互斥锁,但没有展示它在python中是如何完成的。
我如何使用互斥体在Windows上具有单个程序实例,其中互斥锁不限制Windows上的单个程序实例,并且在应用程序和服务之间进行检测。
我不确定为什么你必须在 Windows 上使用互斥体来实现此目的?还有更简单的选择:一个糟糕的旧锁文件。
如果你想要实现的只是确保只有一个应用实例运行,你可以执行以下操作:
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
异常时退出(最好检查其数字代码以确保它恰好是文件已经打开的情况)。
上面是一个粗略的解决方案,一个更漂亮的解决方案是使用进入/退出功能删除锁定文件,如果main
出于任何原因退出。这里的解释:http://effbot.org/zone/python-with-statement.htm