Python逐行输出命令结果匹配main.py即停止的代码修复方案
代码错误原因
原代码存在4个核心逻辑问题:
- 遍历对象错误:直接对完整输出字符串执行
for line in ls,实际是逐个字符迭代,并非按行遍历内容。 - 打印对象错误:循环内打印的是全量输出字符串
ls,而非当前遍历的单行内容,导致每次循环都重复打印完整的ls -l结果。 - 匹配逻辑错误:
str.find()的返回值是匹配位置的整数(未匹配时返回-1),将整数与字符串'main.py'做相等判断永远不会成立,终止逻辑完全不触发。 - 退出逻辑冗余:直接调用
exit()会强制终止整个Python进程,场景适配性差。
修复实现
方案1:简单场景实现(适合短输出命令)
如果命令输出量小,不需要流式读取,可以直接拆分全量输出逐行处理:
import subprocess # 获取命令输出后按换行符拆分为行列表 ls_lines = subprocess.getoutput("ls -l").splitlines() for line in ls_lines: print(line) # 检测当前行包含main.py时终止 if 'main.py' in line: print('###### stops here #######') break
方案2:流式逐行读取(适合长输出/持续输出命令)
如果需要边执行命令边逐行打印,不用等命令完全执行完再处理,可以通过Popen捕获输出流逐行读取,匹配到目标后直接终止子进程:
import subprocess # 启动子进程,配置管道捕获标准输出 proc = subprocess.Popen( ["ls", "-l"], stdout=subprocess.PIPE, text=True ) # 逐行迭代输出流 for line in proc.stdout: # 去除行尾自带的换行符,避免print输出空行 current_line = line.rstrip("\n") print(current_line) if "main.py" in current_line: print("###### stops here #######") # 终止未执行完的子进程,避免资源泄漏 proc.terminate() break
运行以上代码即可得到预期输出:
-rw-r--r-- 1 runner runner 9009 Feb 19 19:00 poetry.lock -rw-r--r-- 1 runner runner 354 Feb 19 19:00 pyproject.toml -rw-r--r-- 1 runner runner 329 Feb 25 00:10 main.py ###### stops here #######
内容的提问来源于stack exchange,提问作者Lucas Fernandes
相关产品推荐
相关产品推荐

