python - Python:尝试迭代子进程输出时,迭代是按字符而不是按行
问题描述
我一直在尝试通过在 SO 上做和研究来自学有关系统管理的 Python 3。
该函数的目的是调用外部命令 who -q 并迭代输出,将每一行(用户)包装在 HTML 标记中(保存最后的总用户行)。但是,实际输出是包裹在 HTML 标记中的每个字符。
我不知道为什么它在每个字符上进行迭代,或者如何让它逐行迭代。
connusers = str(subprocess.check_output("who -q; exit 0", stderr=subprocess.STDOUT, shell=True).decode())
conntable.write("<ul>\n")
for conn in connusers:
if "#" not in conn:
conntable.write("<li>"+ conn +"</li>\n")
conntable.write("</ul>\n")
解决方案
欢迎来到 stackoverflow,您已经收到了两条评论,解释了如何让它工作,只是快速说明为什么会发生这种情况:
for 循环遍历一个可迭代对象,在大多数情况下,这是一个列表,它遍历该列表的成员。如果是字符串,它会迭代其字符。您的文本行不会保存在行列表中,而是保存在一个字符串中,换行符保存为\n
. 所以对于 pythonconnusers
来说只是一个长字符串,它会遍历它的字符。使用@Rakesh和@juanpa.arrivillaga给出的解决方案,您可以将这个长字符串拆分为一个行列表,然后您可以对其进行迭代。
推荐阅读
- angular - What is the best practice to change a single object in Angular component in a reactive way
- typo3 - TYPO3 CMS 的 SurveyJS 扩展。从哪儿开始?还是原生表单框架就足够了?
- python - django admin 在使用单独的表单进行添加和更新时不断提高验证错误
- php - Laravel 邮件程序缓慢(1-2 秒)性能
- kotlin - MockK:为泛型函数中的不同类型参数返回不同的结果
- android - 建立从 Android 到 MySQL 的连接
- android - 如何在并行 android 中运行多个 kotlin couroutines?
- wordpress - 404 图像的 WordPress 后备
- php - 无法从 cron 作业运行 laravel 计划在 cpanel 中不起作用
- redis - Redis,试图找出存储数据的最佳方式,以便分页显示