2017-02-14 18 views
0

Я новичок в Python. Существует мой вопрос:Почему существует странное форматирование из подпроцесса.Popen с командой оболочки?

а) ShellHelper.py:

import subprocess 


def execute_shell(shell): 
    process = subprocess.Popen(shell, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    output = process.communicate()[0] 
    exit_code = process.returncode 

    if exit_code == 0: 
     return output 
    else: 
     raise Exception(shell, exit_code, output) 

б) Launcher.py

from ShellHelper import * 


command = input("Enter shell command: ") 
out = execute_shell(command) 
print(out.split()) 

с) Мой терминал:

pc19:AutomationTestSuperviser F1sherKK$ python3 Launcher.py 
Enter shell command: ls 
[b'Launcher.py', b'ShellHelper.py', b'__pycache__'] 
  1. Почему Я получаю это странное форматирование, как b' перед каждым файлом?
  2. Нужно ли это перечислять?
  3. Нужно ли мне еще форматировать, так что это явная строка?
+1

2) Вы сделали это list, выполнив 'out.split()' – TemporalWolf

+0

. Вы используете Python 3, где все строки - это строки unicode (каждый символ равен 2 байтам). Префикс 'b' перед строкой означает, что строка является байтовой строкой (каждый символ равен 1 байт). Это потому, что система возвращает bytestring, и она не работает «изначально» в unicode, как это делает python. – Zizouz212

+0

О 'split' было непреднамеренно. Я не заметил. Я хотел «полоса» там. – F1sher

ответ

0

Декодировать вывод для преобразования из строки байта в "обычный" текст. Список создается split, вы можете join списки с пробелами, чтобы создать нормальный ls вывод:

out = execute_shell(command).decode("utf-8") 
print(" ".join(out.split())) 
0

Чтобы обеспечить более четкий ответ, необходимо учитывать следующее:

1) Выходной ваш процесс не отформатирован в формате ASCII, так что b, который вы видите в начале ваших файлов, указывает на то, что строка находится в двоичном формате.

2) Вы выбираете, чтобы вернуть список к функции печати, как это:

'file1 file2 file3'.split() => ['file1', 'file2', 'file3'] 

в то время как это будет печатать каждую строку в отдельной строке:

for foo in 'file1 file2 file3'.split(): 
    print foo # this will also remove the b and print the ascii alone