如何用Python subprocess同时启动GUI与驱动程序,无需等待对方执行完成?
解决GUI与驱动代码同时运行的问题
你当前使用的subprocess.call()是阻塞式调用——它会等待第一个命令(GUI程序)完全执行完毕后,才会启动第二个命令(驱动代码),这就是没法同时运行的原因。下面给你两种可行的解决方案:
方案一:用subprocess.Popen实现非阻塞启动
Popen是subprocess模块的非阻塞方法,启动进程后会立刻返回,不会等待进程结束,正好满足你的需求:
import subprocess # 启动GUI程序,直接返回,不等待结束 subprocess.Popen(["pypy3", "gui-main-staff.py"]) # 启动驱动代码,同样直接返回 subprocess.Popen(["pypy3", "driver.py"])
如果后续需要管理这两个进程(比如手动终止),可以保存Popen对象:
import subprocess # 保存进程引用 gui_process = subprocess.Popen(["pypy3", "gui-main-staff.py"]) driver_process = subprocess.Popen(["pypy3", "driver.py"]) # 后续需要终止进程时调用 # gui_process.terminate() # driver_process.terminate()
方案二:正确使用multiprocessing模块
你之前用multiprocessing没成功,大概率是没遵循模块的使用规范(比如Windows下必须加if __name__ == "__main__":)。正确的用法如下:
import multiprocessing import subprocess # 定义启动GUI的函数 def start_gui(): subprocess.call(["pypy3", "gui-main-staff.py"]) # 定义启动驱动的函数 def start_driver(): subprocess.call(["pypy3", "driver.py"]) if __name__ == "__main__": # 创建进程对象 gui_proc = multiprocessing.Process(target=start_gui) driver_proc = multiprocessing.Process(target=start_driver) # 启动两个进程 gui_proc.start() driver_proc.start() # 注意:如果不需要等待进程结束,不要加join() # 加join()会阻塞主进程,直到对应子进程跑完 # gui_proc.join() # driver_proc.join()
注意事项
- Windows系统下使用
multiprocessing必须加if __name__ == "__main__":,否则会出现进程重复创建的问题; - 如果你的GUI程序自带主循环(比如Tkinter的
mainloop()、PyQt的exec()),启动后会自动维持运行,不需要额外处理。
内容的提问来源于stack exchange,提问作者nail_
相关产品推荐
相关产品推荐

