You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在一个主文件中并发运行多个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 07:37:41