2015-10-02 2 views
0

Я пишу скрипт Python, который перечисляет все процессы, запущенные на компьютере. Мой текущий код делает это, но печатает это в большом блоке текста, который трудно читать. Как я могу улучшить свой скрипт, чтобы иметь выходной текст в вертикальном списке для каждого процесса и всего?Создание блока текста в список

import subprocess 
print(subprocess.check_output('set',shell=True) 

* Edit: Вот вывод текста из приведенного выше сценария enter image description here

+0

Приведите пример, как результат должен выглядеть. Я нахожу, что выход уже вполне читаем. – user38034

+0

'subprocess.check_output' возвращает строку. Вы можете делать с ним все, что хотите, например, разделите его на новые строки с помощью 'split', который создаст список. – user38034

+0

@ user38034, который будет разделен пробелами. возможно, вы имели в виду раздельные линии. – wim

ответ

-1

set уже должен печатать с новой строкой, так что, если они не отображаются, что-то более неправильно, чем вы говорите нас. Вы всегда можете удвоить символ новой строки, если вы хотите разделить настройки друг от друга, например:

import subprocess 
print(subprocess.check_output('set',shell=True).replace('\n', '\n\n')) 

Если проблема заключается в том, что вы работаете на Python 3 и bytes объект большой двоичный объект, вы можете сделать subprocess декодировать его в дружественной печати строки для вас:

print(subprocess.check_output('set',shell=True, universal_newlines=True)) 
# Yes, the name of the keyword is dumb; it sounds like it handles different 
# line ending conventions, but on Python 3, it also decodes from `bytes` 
# to `str` for you. 

в общем случае переноса строк славно (хотя она ничего не делает для абзацев текста, которые просто «слишком большой»), вы можете захотеть взглянуть на textwrap module; он разбивает блок текста на list строк, хорошо украшенных границами слов, поэтому у вас нет слов, разделенных по строкам.

+0

'.replace ('\ n', '\ n \ n')' неверно; вывод показывает, что OP использует Python 3. 'universal_newlines = True' использует' locale.getpreferredencoding (False) ', который может возвращать что-то вроде' cp1252', в то время как 'set' может использовать OEM-кодировку cmd.exe, такую ​​как' cp437'. Если вы не хотите использовать 'os.environ' (который, вероятно, использует Unicode API в Windows) по какой-то причине, вы можете попытаться [принудительно использовать' set' для использования кодировки utf-16 для поддержки путей, отличных от ascii] (http://stackoverflow.com/a/32902728/4279) – jfs

-1

Отказ от ответственности: Я не делал то, что вы делаете раньше, но это может сработать.

import subprocess 

processes = subprocess.check_output('set',shell=True) 

processes = processes.decode('UTF-8').split('\n') # convert bytes to unicodes and split 

for process in processes: 
    print(process) 
+0

Это сработало так же, как и ответ @ ShadowRanger –

+0

@DylanF: маловероятно, что 'set' использует utf-8 здесь; это, вероятно, 'cp437', т. е. ожидать сбой, если есть пути, отличные от ascii. Вывод в вашем вопросе ясно показывает, что новая строка - 'b '\ r \ n'', а не' '\ n'' – jfs

0

set is an internal command, который отображает cmd.exe переменные среды в вашем случае.

Чтобы получить переменные окружения в Python, используйте вместо этого os.environ.

Если вы хотите, чтобы получить выход set команды в виде списка строк (не проверено):

#!/usr/bin/env python3 
import os 
from subprocess import check_output 

lines = check_output('cmd.exe /U /c set').decode('utf-16').split(os.linesep) 
Смежные вопросы