python依次运行多个代码遇到的同步与异步问题

news2024/9/24 17:11:10

1、要实现在一个Python代码运行完后紧接着运行另一个Python代码,可以使用Python的subprocess模块。该模块可以创建新进程并与之交互,可以用于在Python代码中启动新的程序或脚本。

下面是一个示例代码,用于在运行完code1.py后紧接着运行code2.py

import subprocess

subprocess.run(['python', 'code1.py'], check=True)
subprocess.run(['python', 'code2.py'], check=True)

以上代码将在主进程中依次运行两个子进程,第一个子进程运行code1.py,当其结束后,主进程开始运行第二个子进程,即运行code2.py

其中,check=True参数表示在子进程运行期间如果出现错误会抛出异常,如果不设置该参数则不会抛出异常。

2、要在 Python 中自动为 input 输入框中输入一个字符并回车,可以使用 subprocess 模块中的 Popen() 方法启动一个新进程,然后将要发送到标准输入流的数据传递给该进程。

以下是一个示例代码,作为演示:

import subprocess

# 启动一个新的子进程
process = subprocess.Popen(['python'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

# 将要输入的数据写入标准输入流,并换行
process.stdin.write(b'a\n')
# 刷新缓冲区
process.stdin.flush()

# 读取并打印子进程输入
output, errors = process.communicate()
print(output.decode('utf-8'))

可以看到,run换成了Popen,Popen的作用是启动一个新进程,然后将要发送到标准输入流的数据传递给该进程。

假如我们的需求是:对于有的代码能:运行结束后运行下一个:那么用run就行
对于别的代码,我们需要它只运行一定时间,运行到这个时间后就shutdown后接着运行下一个  对于这样的需求,我们用Popen就行
但是我们遇到了问题:  Popen运行后还会启动后面的代码,因为其是同步线程 会启动线程来运行,所以原来的线程会继续运行,而run是异步运行,运行完了才会接着运行下一个,所以问题就出在了Popen,我们要解决Popen运行未结束就运行run的代码的问题

例:

p1 = subprocess.Popen(['python', r"测试run和Popen01.py"])
# time.sleep(2)
# shutdown_chromes("Chrome")
# p1.terminate()
p1.wait()

subprocess.run(['python', r"测试run和Popen02.py"], input=b"q\n")
# shutdown_chromes("Chrome")

p3 = subprocess.Popen(['python', r"测试run和Popen03.py"])
# time.sleep(2)
# shutdown_chromes("Chrome")
# p3.terminate()
p3.wait()
#
p3 = subprocess.Popen(['python', r"测试run和Popen04.py"])
# time.sleep(2)
# shutdown_chromes("Chrome")
# p3.terminate()
p3.wait()

subprocess.run(['python', r"测试run和Popen01.py"], input=b"q\n")

subprocess.run(['python', r"测试run和Popen02.py"], input=b"q\n")

p3 = subprocess.Popen(['python', r"测试run和Popen03.py"])
# time.sleep(2)
# shutdown_chromes("Chrome")
# p3.terminate()
p3.wait()

subprocess.run(['python', r"测试run和Popen04.py"], input=b"q\n")

p3 = subprocess.Popen(['python', r"测试run和Popen01.py"])
# time.sleep(2)
# shutdown_chromes("Chrome")
# p3.terminate()
p3.wait()
subprocess.run(['python', r"测试run和Popen02.py"], input=b"q\n")

运行结果: 

按照顺序输出了!!!!!!!

 如果没有wait(),就会乱套:

p1 = subprocess.Popen(['python', r"测试run和Popen01.py"])
# time.sleep(2)
# shutdown_chromes("Chrome")
# p1.terminate()
# p1.wait()

subprocess.run(['python', r"测试run和Popen02.py"], input=b"q\n")
# shutdown_chromes("Chrome")

p3 = subprocess.Popen(['python', r"测试run和Popen03.py"])
# time.sleep(2)
# shutdown_chromes("Chrome")
# p3.terminate()
# p3.wait()
#
p3 = subprocess.Popen(['python', r"测试run和Popen04.py"])
# time.sleep(2)
# shutdown_chromes("Chrome")
# p3.terminate()
# p3.wait()

subprocess.run(['python', r"测试run和Popen01.py"], input=b"q\n")

subprocess.run(['python', r"测试run和Popen02.py"], input=b"q\n")

p3 = subprocess.Popen(['python', r"测试run和Popen03.py"])
# time.sleep(2)
# shutdown_chromes("Chrome")
# p3.terminate()
# p3.wait()

subprocess.run(['python', r"测试run和Popen04.py"], input=b"q\n")

p3 = subprocess.Popen(['python', r"测试run和Popen01.py"])
# time.sleep(2)
# shutdown_chromes("Chrome")
# p3.terminate()
# p3.wait()
subprocess.run(['python', r"测试run和Popen02.py"], input=b"q\n")

 

 所以,总结:

Popen跟wait()使用更香哦!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/430853.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文配色方案(收藏)

方案一:复古 系列色——十六进制颜色码: 0780cf - 765005 - fa6d1d - 0e2c82 - b6b51f - da1f18 - 701866 - f47a75 - 009db2 - 024b51 - 0780cf - 765005 系列色——RGB颜色值: (7,128,207)-(118,80,5&…

【记录】优化油猴插件【BD网盘播放器】

收获最重要前言优化代码收获1.禁止浏览器弹窗2.定时器3.设置属性-隐藏元素4.鼠标悬停和移开事件5.添加元素6.div里均匀分布7.获取元素属性值8.监听播放器状态9.jQuery 选择器前言 有钱的可以支持一下原作者,没钱就要多学习 优化 1.1 视频刚开始未播放时&#xff…

酷雷曼一站式图片直播,助力品牌高效传播

传统模式下,摄影师拍摄会议、活动现场的照片后,一般需要7-10天时间才能完成成片交付,而实际上,由于新闻宣传的即时性,照片延迟交付,远远不能满足客户的需求。因此,即时图片直播技术应运而生&…

Jenkins自动化部署实例讲解

文章目录 前言实例讲解基本环境全局工具配置创建任务任务配置源码管理构建步骤(Build Steps)第一步:调用Maven第二步:执行shell启动容器 后记 前言 你平常在做自己的项目时,是否有过部署项目太麻烦的想法?…

哈希应用——位图(bitset)

目录 见见猪跑(初步了解位图) 位图的模拟实现 位图的应用 1、给定100亿个整数,设计算法找到只出现一次的整数 2、给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集? 3、位图应用变形&#xff…

第六章 Gated RNN

目录6.1 RNN的问题6.1.1 RNN的复习6.1.2 梯度消失和梯度爆炸6.1.3 梯度消失和梯度爆炸的原因6.1.4 梯度爆炸的对策6.2 梯度消失和LSTM6.2.1 LSTM的接口6.2.2 LSTM层的结构6.2.3 输出门6.2.4 遗忘门6.2.5 新的记忆单元6.2.6 输入门6.2.7 LSTM的梯度的流动6.3 LSTM的实现6.4 使用…

CIO成就计划第二季第一期 | 活动回顾:基于数字技术重塑流程,驱动业务增长

2023年3月25日,《科创人》联手金蝶共同打造的【CIO成就计划第二季】首期培训在北京金蝶软件园圆满举行。 【CIO成就计划】第二季,坚持服务于企业CIO、数字化变革负责人的价值定位,通过三期线下闭门培训会社群交流,帮助CIO建立应对…

JUC高级十-AbstractQueuedSynchronizer之AQS

1. 前置知识 公平锁和非公平锁可重入锁自旋锁LockSupport数据结构之双向链表设计模式之模板设计模式 AQS重要性 JAVA ------>JVM AQS ------>AQS 2. AQS入门级别理论知识 2.1 是什么? 2.1.1 字面意思 Abstract Queued Synchronizer----抽象的队列同步器 源码位置: …

【Java 并发编程】一文读懂线程、协程、守护线程

一文读懂线程、协程、守护线程1. 线程的调度1.1 协同式线程调度1.2 抢占式线程调度1.3 设置线程的优先级2. 线程的实现模型和协程2.1 内核线程实现2.2 用户线程实现2.3 混合实现2.4 Java 线程的实现2.5 协程2.5.1 出现的原因2.5.2 什么是协程2.5.3 Java19 虚拟线程 - 协程的复苏…

Cat原理简析

Cat原理简析 链路追踪系统设计思路如何高效组织业务日志如何动态串联业务日志通用解决方案链路定义链路染色链路上报链路存储 Cat原理客户端原理API设计序列化和通信客户端埋点核心类分析流程分析启动流程:消息生产Context 线程本地变量Transaction事务的开启其他类型消息组合关…

网页设计方向有哪些SCI期刊推荐? - 易智编译EaseEditing

网页设计和开发方向主要涉及人机交互、用户体验、可访问性等方面,以下是几个相关的SCI期刊推荐: ACM Transactions on Computer-Human Interaction (ACM TOCHI): 该期刊由ACM(Association for Computing Machinery)出…

一次etcd变更引发的惨案

问题描述 在做etcd的数据变更时候,etcd在组成集群的时候出现leader不断切换问题,导致集群不稳定,都面将不健康的etcd节点踢出,只剩etcd单节点,后面将踢出的etcd节点重新加入现有etcd,导致etcd集群奔溃&…

【java踩坑搞起】MybatisPlus封装的mapper不支持 join,那咋办

众所周知,Mybatis Plus 封装的 mapper 不支持 join,如果需要支持就必须自己去实现。但是对于大部分的业务场景来说,都需要多表 join,要不然就没必要采用关系型数据库了。 直到前几天,偶然碰到了这么一款叫做mybatis-p…

权限提升:网站后台.(提权思路.)

权限提升:网站后台 权限提升简称提权,由于操作系统都是多用户操作系统,用户之间都有权限控制,比如通过 Web 漏洞拿到的是 Web 进程的权限,往往 Web 服务都是以一个权限很低的账号启动的,因此通过 Webshell …

Form Designer V2发布

基于Ant Design 和 jQuery UI 的表单设计器 github 地址 特性 React Vue 3.x Typescript 统一的组件定义,对Vue 和React 的实现提供一个统一的组件定义描述 概念 Component 组件Layout 布局,一种特殊的ComponentComponent Editor 组件属性编辑器Comp…

【开发日志】2023.04 ZENO----Composite----CompImport、ReadImageFlie

CompImport TEST: 用ParticlesWrangle创造属性A(紫色),B(青色) ,用CompImport结点将属性转化为图片输入到Composite3进行合成 Input: Output: /* 导入地形网格的属性,可能会有多个属…

Docker安装 docker-registry 镜像仓库

一、运行如下命令安装docker-registry镜像仓库: docker run -d \ -p 5000:5000 \ -v /usr/local/registry:/var/lib/registry \ --restartalways \ --name registry \ registry:2 二、测试镜像生成并推送到镜像仓库 1、新建一个目录 mkdir target 2、上传一…

Taro+Vue3 小程序引入echarts表

背景:根据需求在一个报告界面需要展示不同的echarts表来使数据更友好的显示。 效果如下: 一.taro支持echarts 官方说明:Taro 文档支持引用小程序端第三方组件库 物料文档:Taro 物料市场 | 让每一个轮子产生价值 二.引入echart…

Qt5.12實戰之Linux靜態庫編譯與調用完整過程

1.安裝gedit sudo apt-get install gedit -y 2.使用gedit編輯靜態庫源文件test.cpp gedit test.cpp 輸入下面內容 &#xff1a; #include <stdio.h> int func() {return 888; } 如下圖操作&#xff1a; 保存test.cpp並編譯 爲目標文件 gcc -c test.cpp如下圖示&am…

【剑指 Offer】(1)

文章目录前言一、 数组中重复的数字:fire: 解决方法:dog: 代码二、二维数组中的查找:fire:思路:dog:代码三、替换空格:fire:思路:dog: 代码四、从尾到头打印链表:fire:思路:dog:代码:dog: 代码五、重建二叉树:fire:思路:dog: 代码总结前言 剑指offer系列是一本非常著名的面试题…