使用Python os.popen查询kafka topic列表时出现末尾空行的问题
问题原因
你遇到的末尾空字符串问题和sed命令无关,是Python字符串拆分的正常行为:
- 所有命令行输出的最后一行末尾默认会带一个换行符,比如你终端输出3个topic,实际返回的完整字符串格式为
topic1\ntopic2\ntopic3\n - 你使用
split('\n')对上述字符串做拆分时,末尾的\n会被切分为最后一个空字符串,比如测试代码print('a\nb\n'.split('\n'))的输出就是['a', 'b', ''] - 你加的sed命令只会删除完全空白的行,不会处理最后一行末尾的换行符,所以终端直接执行命令时看不到空行,但字符串拆分还是会触发这个问题
解决方案
你可以选择以下任意一种方式解决,推荐优先使用第一种:
- 替换
split('\n')为Python内置的splitlines()方法,该方法专门用于按行拆分字符串,会自动忽略末尾换行符带来的空元素:
import os # 注意不要用list作为变量名,会覆盖Python内置的list类型 topic_list = os.popen("kafka-topics.sh --zookeeper zoo_server:2181 --list | sed '/^[[:space:]]*$/d'").read().splitlines() print(topic_list)
- 拆分后手动过滤空元素,适合需要额外处理空白内容的场景:
import os raw_output = os.popen("kafka-topics.sh --zookeeper zoo_server:2181 --list | sed '/^[[:space:]]*$/d'").read() topic_list = [item for item in raw_output.split('\n') if item.strip()] print(topic_list)
- 使用更规范的
subprocess模块执行外部命令(Python官方更推荐的外部命令调用方式):
import subprocess cmd = "kafka-topics.sh --zookeeper zoo_server:2181 --list | sed '/^[[:space:]]*$/d'" topic_list = subprocess.getoutput(cmd).splitlines() print(topic_list)
内容的提问来源于stack exchange,提问作者jessica
相关产品推荐
相关产品推荐

