使用Python的subprocess执行另外一个python文件(应用之一是Pytorch中如何让多个不同的模型同时/并行进行训练)

文章目录

话不多说了,直接看代码。

subprocess基础使用

假设我要运行一个名字叫helloworld.py的文件,在主程序如下运行即可。

复制代码
主程序
import subprocess
p = subprocess.Popen(["python", "helloworld.py"])

相当于就是在执行,

复制代码
python helloworld.py

所以,如果helloworld.py需要额外传入参数才能运行,可以在那个列表["python", "helloworld.py"]里继续添加。例如:

复制代码
python helloworld.py --args 1

subprocess高级使用

上面这样执行另外一个python程序,其实我们并没有关心那个程序什么时候运行结束。

有的时候我们有这种需求:主程序需要等待helloworld.py运行结束才能往下运行,因为helloworld.py运行结束后会输出一些结果,这些结果是主程序需要的。

那该怎么做呢?使用wait

复制代码
import subprocess
p = subprocess.Popen(["python", "helloworld.py"])
p.wait()
后面的程序

这样的话,后面的程序就会等待helloworld.py运行结束后再运行,没有wait的话后面的程序与helloworld.py并行运行。

subprocess多进程

上面只调用了一个外部文件执行,我们可以多调用几个,这几个程序是并行执行的!

复制代码
Ps=[]
p1 = subprocess.Popen(["python", "helloworld.py"])
Ps.append(p1)
p2 = subprocess.Popen(["python", "helloworld2.py"])
Ps.append(p2)
for p in Ps:
    p.wait()
后面的程序

p1和p2这两个进程谁先执行完毕是未知的。使用wait之后,我们会等待这两个进程都执行完毕之后再执行主程序。

subprocess执行情况

执行子进程的过程中,有可能子进程报错了,那我们在主进程中怎么知道呢?查看进程的返回码即可。

复制代码
p.returncode

返回码有以下几种情况:

0:执行完毕且没有报错。

非0:执行中报了错,停止了运行

None:还没有执行完毕。

在深度学习中的应用

上面开多个进程同时执行多个程序,这在深度学习里面可以对应到开多个进程对多个不同的模型同时训练。

有人说,这样的话,岂不是在多个进程里面,都要重复读取数据,然后模型训练?是的。

只在主进程里读取数据,然后传递数据作为一个参数给新开的各个进程,这个暂时不知道该怎么办。应该可以在主进程里面将数据写入文件,然后各个进程读取。除此之外,想不到更好的办法了,torch.multiprocessing试过了不行,可以看我之前文章。

相关推荐
少云清6 分钟前
【性能测试】15_JMeter _JMeter插件安装使用
开发语言·python·jmeter
光羽隹衡28 分钟前
机器学习——TF-IDF实战(红楼梦数据处理)
python·tf-idf
chinesegf1 小时前
ubuntu中虚拟环境的简单创建和管理
linux·运维·ubuntu
java_logo1 小时前
2025 年 11 月最新 Docker 镜像源加速列表与使用指南
linux·运维·docker·容器·运维开发·kylin
一碗面4212 小时前
Linux下的网络模型
linux·网络模型
2401_894828122 小时前
从原理到实战:随机森林算法全解析(附 Python 完整代码)
开发语言·python·算法·随机森林
B站计算机毕业设计超人2 小时前
计算机毕业设计Python知识图谱中华古诗词可视化 古诗词情感分析 古诗词智能问答系统 AI大模型自动写诗 大数据毕业设计(源码+LW文档+PPT+讲解)
大数据·人工智能·hadoop·python·机器学习·知识图谱·课程设计
玄同7652 小时前
Python「焚诀」:吞噬所有语法糖的终极修炼手册
开发语言·数据库·人工智能·python·postgresql·自然语言处理·nlp
johnny2332 小时前
Python管理工具:包、版本、环境
python
羽翼.玫瑰2 小时前
关于重装Python失败(本质是未彻底卸载Python)的问题解决方案综述
开发语言·python