Python: при попытке перебрать вывод подпроцесса итерация выполняется по символу, а не по строке.

Я пытался научить себя Python 3 в отношении системного администрирования, выполняя и исследуя здесь SO.

Эта функция предназначена для вызова внешней команды 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")

person Ben M.    schedule 10.12.2018    source источник
comment
Когда вы перебираете строку, она перебирает каждый символ. Это нормальное поведение. Вы можете использовать .split('\n') для создания списка строк.   -  person juanpa.arrivillaga    schedule 10.12.2018
comment
Благодарю вас! Вот оно. Теперь я понимаю, почему это происходило именно так. Я ценю объяснение.   -  person Ben M.    schedule 10.12.2018


Ответы (1)


Добро пожаловать в stackoverflow, вы уже получили два комментария, объясняющих, как заставить его работать, просто краткое изложение, почему это происходит:

Цикл for выполняет итерацию по итерируемому объекту, в большинстве случаев это список, и он выполняет итерацию по членам этого списка. В случае строк он выполняет итерацию по своим символам. Строки вашего текста сохраняются не в списке строк, а в одной строке с разрывами строк, сохраняемыми как \n. Так что для python connusers это просто длинная строка, и она будет перебирать ее символы. С решениями, предоставленными @Rakesh и @juanpa.arrivillaga, вы разбиваете эту длинную строку на список строк, по которым затем можете выполнять итерацию.

person Bernhard    schedule 10.12.2018