如何在一个主文件中并发运行多个Python脚本?
解决方法
方案一:修正subprocess用法实现并行
你之前的问题出在调用了p1.communicate(),这个方法会阻塞主进程直到p1运行结束,导致p2只能等p1跑完才启动。只要先启动所有进程,再按需等待或处理输出即可:
如果想让脚本的输出直接打印到控制台,直接启动进程不用额外设置:
import subprocess import sys # 同时启动两个脚本,不阻塞主进程 p1 = subprocess.Popen([sys.executable, "first.py"]) p2 = subprocess.Popen([sys.executable, "second.py"]) # 可选:等待所有进程执行完毕 p1.wait() p2.wait()
要是需要给每个脚本的输出加上标识方便区分,可以用线程实时读取输出:
import subprocess import sys from threading import Thread def print_output(process, script_name): for line in iter(process.stdout.readline, b''): print(f"[{script_name}] {line.decode().strip()}") process.stdout.close() # 重定向输出到管道,方便捕获 p1 = subprocess.Popen( [sys.executable, "first.py"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True ) p2 = subprocess.Popen( [sys.executable, "second.py"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True ) # 启动线程处理每个进程的输出 t1 = Thread(target=print_output, args=(p1, "first.py")) t2 = Thread(target=print_output, args=(p2, "second.py")) t1.start() t2.start() # 等待进程和线程结束 p1.wait() p2.wait() t1.join() t2.join()
之后可以用p1.terminate()或者p1.kill()随时终止指定进程。
方案二:用multiprocessing管理独立脚本进程
要是想用multiprocessing来管控进程,可以让每个子进程调用subprocess执行脚本,这样每个脚本都是独立运行的,和直接双击执行效果一致:
import multiprocessing import subprocess import sys def run_script(file_path): subprocess.run([sys.executable, file_path]) # 创建进程 p1 = multiprocessing.Process(target=run_script, args=("first.py",)) p2 = multiprocessing.Process(target=run_script, args=("second.py",)) # 启动进程 p1.start() p2.start() # 等待进程结束(可选) p1.join() p2.join() # 终止进程用 p1.terminate()
方案三:导入脚本的main函数(规范推荐)
如果你的脚本是规范写法(有if __name__ == "__main__":块,核心逻辑放在main函数里),直接导入main函数在子进程调用更高效:
比如first.py的结构:
def main(): # 核心逻辑 print("first.py 运行中") if __name__ == "__main__": main()
主文件里这么写:
import multiprocessing import first import second # 创建进程调用main函数 p1 = multiprocessing.Process(target=first.main) p2 = multiprocessing.Process(target=second.main) p1.start() p2.start() # 按需管理进程,比如终止用 p1.terminate() p1.join() p2.join()
这种方式不用启动额外的Python解释器,进程管理更直接。虽然你担心main函数不该被外部调用,但这是Python社区的常规做法,只要main函数的逻辑设计成可调用的(比如把命令行参数改成函数参数)就没问题。
内容的提问来源于stack exchange,提问作者Stupid genius
相关产品推荐
相关产品推荐

