python - 如何防止包含 py2exe 的 Python 程序启动多个 session ?

标签 python

我有一个包含 py2exe 的 Python 程序。该程序运行良好,但是,用户可以有意或无意地启动第二个实例(第三个等)。

这是不可取的,特别是因为程序使用串行端口,因此下一个 session 会发现端口繁忙,从而给出端口错误等。

如何防止程序在第一个 session 启动后启动另一个 session ?

最佳答案

有很多方法可以标记程序是否正在运行。以下是我会做的几件事:

1)您可以在临时文件夹中创建一个临时文件来表示我(如程序中)正在运行。因此,每当打开一个新实例时,它都会检查临时文件夹中是否存在临时文件,如果存在,则会抛出一个错误,指出只能打开一个实例。请记住,退出之前您必须清除临时文件。

这只适用于程序正常退出。如果程序被强制关闭,则临时文件可能不会被删除,从而导致下次运行时出现问题。

2) 你可以检查当前进程列表来检查你的程序是否正在运行,然后抛出错误。这将需要 pywin32 模块来访问进程列表。这需要更多的处理并增加更多的开销(pywin32 模块)。但这更可靠。

您可以混合两者的组合,始终检查 1,如果 1 失败则检查 2。如果您想使用 pywin32 访问进程列表,这里有一个示例代码。您可以从这里获取pywin32:http://sourceforge.net/projects/pywin32/

import win32com.client
import sys

def CheckMultipleInstances():
    winmgmts = win32com.client.GetObject('winmgmts:')
    processes = winmgmts.InstancesOf('Win32_Process')
    count = 0
    for p in processes:
        if 'MyProgram.exe' == p.Properties_("Name").Value:
            count += 1
            if cound > 1:
                # This would mean that the current instance is the second one
                # raise 'Only one instance of the program can run'
                # Send a message to the user for confirmation
                # Do other code
                sys.exit()

[编辑]如果您使用多线程。您必须在使用 win32com 模块的线程中使用 pythoncom.CoInitialize()

关于python - 如何防止包含 py2exe 的 Python 程序启动多个 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26370359/

相关文章:

python - Selenium 在等待元素后卡住(Python)

python - bash 和 python 管道的区别

python - 拆分 Pandas 列并将新结果附加到数据框

python - Selenium 滚动到底部无法正常工作

python - 使用子进程调用从 python 函数重新启动 Linux 服务器

python - 在 Python 3 中使用 dbm 模块

python - 遵循某种概率分布,为给定大小的位串生成转移概率矩阵

python - 如何防止使用相同值创建新 SQLAlchemy 对象的 UUID 主键

python - Bigquery 加载时间戳时出错

python - 提高索引搜索和删除的性能