如何实现右键启动的同程序多实例自动关闭仅留一个活动实例
批量启动程序实例的单窗口保留方案
问题背景
通过右键菜单启动文件移动及处理程序时,批量选择文件会触发多个程序实例(如选50个文件就启动50次),需要仅保留一个活动窗口。现有代码无法100%稳定运行:
# ======================================================== #this only catches the file adress that was right clicked and launch with the app. Then it moves it to the installer folder try: # THIS CATCHES THE SELECTED FILE LINK TO BE MOVED TO THE INSTALL FOLDER IF IT IS SUCCESSFULL variable= sys.argv[1] index = -1 for i in variable: index = index + 1 if "\\" in i: sum= index # MOVE TO INSTALLER DIRECTORY shutil.move(variable, Install_folder + f"\\Installer\\files\\{str(variable[sum+ 1::])}") except: print('FILE NOT ADDED THROUGH THE MOVE TOOL') #========================================================= processlist = list() time.sleep(int(time.process_time())*random.randint(1,3)) for process in psutil.process_iter(): processlist.append(process.name()) if processlist.count("program.exe") >= 4: sys.exit()
问题根源在于多个实例同时启动,进程计数逻辑无法精准控制实例留存。不想拆分移动和处理程序为两个独立进程。
最终解决方案代码
try: variable = sys.argv[1] index = -1 # THIS CATCHES THE SELECTED FILE LINK TO BE MOVED TO THE HANDY INSTALL FOLDER IF IT IS SUCCESSFULL for i in chetita: index = index + 1 if "\\" in i: sum = index # CHOOSES DIRECTORY WHERE THE FILES TO BE INSTALLED ARE shutil.move(variable, f"{Install_folder}\\program\\InstallFolder\\{str(variable[sum + 1::])}") os.makedirs(f"{Install_folder}\\program\\Queue") tiger = [] serpent = [] while True: time.sleep(1) serpent = os.listdir(f"{Install_folder}\\program\\InstallFolder") time.sleep(1) tiger = os.listdir(f"{Install_folder}\\program\\InstallFolder") if tiger == serpent: break except: if os.path.exists(f"{Install_folder}\\program\\Queue"): sys.exit() print('application executed directly through the .exe')
方案原理
所有实例启动后:
- 第一个完成文件移动的实例会创建
Queue文件夹,并进入循环,每隔1秒读取目标文件夹内容,连续两次读取结果一致时(说明其他实例已全部完成文件移动并退出),退出循环开始后续处理。 - 其他实例因无法创建
Queue文件夹(文件夹已被第一个实例创建,os.makedirs会抛出异常),触发except分支,检测到Queue文件夹存在后直接退出。
内容的提问来源于stack exchange,提问作者shadowuy
相关产品推荐
相关产品推荐

