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

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会话中独立运行:

  1. 先确认系统安装了screen,未安装可执行命令:sudo apt install screen -y
  2. 参考代码如下:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 02:45:07