Ubuntu环境下如何运行Python文件不阻塞主脚本 支持多脚本分终端运行
核心原因
你当前代码阻塞的核心原因是Popen.communicate()方法默认会等待子进程完全终止后才会返回结果,os.system()同样是同步等待子进程执行完成的调用,所以都会卡住主脚本的后续执行。
解决方案
以下提供两种适配Ubuntu环境的实现方式,你可以按需选择:
方案1:异步处理子进程,无需额外终端/会话
不使用communicate,直接操作子进程的标准输入流写入数据,不需要等待子进程结束就可以继续执行主脚本后续代码:
import subprocess # 启动子进程,绑定标准输入输出流,不会阻塞 a = subprocess.Popen( ['python3', 'part.py'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) # 直接写入输入内容,末尾加换行模拟终端回车提交,写完手动刷新缓存 if run_second_bot == True: a.stdin.write(m.text + '\n') else: a.stdin.write(b.text + '\n') a.stdin.flush() # 此处开始主脚本后续代码可以正常执行,不会被阻塞 # 如果需要读取子进程输出不阻塞,可以单独启动子线程读取a.stdout/a.stderr即可
方案2:将子脚本放到独立screen会话中运行(完全隔离,符合你的需求)
通过screen创建后台独立会话运行子脚本,主脚本只负责发送启动和输入命令,完全不会被阻塞,两个子脚本可以分别放到两个不同名称的screen会话中独立运行:
- 先确认系统安装了screen,未安装可执行命令:
sudo apt install screen -y - 参考代码如下:
import subprocess import time # 启动独立screen会话运行part.py,会话名自定义为tg_bot1,不会阻塞主脚本 subprocess.run( ['screen', '-dmS', 'tg_bot1', 'python3', 'part.py'], check=True ) # 等待子脚本启动完成,可根据实际情况调整等待时长 time.sleep(1) # 向screen会话中的子进程发送输入内容 if run_second_bot == True: input_msg = m.text else: input_msg = b.text # 末尾加\n模拟回车提交输入 subprocess.run( ['screen', '-S', 'tg_bot1', '-X', 'stuff', f'{input_msg}\n'], check=True ) # 要运行第二个脚本,只需创建新的不同名称的screen会话即可,比如会话名设为tg_bot2 # subprocess.run(['screen', '-dmS', 'tg_bot2', 'python3', '第二个脚本名.py'], check=True)
常用screen操作命令
- 查看运行中的会话列表:
screen -ls - 进入指定会话查看运行状态:
screen -r 会话名 - 退出会话(不终止进程):按
Ctrl+A后按D - 终止指定会话:
screen -S 会话名 -X quit
内容的提问来源于stack exchange,提问作者amiralirj
相关产品推荐
相关产品推荐

