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

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()使用更香哦!!!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值