Может ли кто-нибудь объяснить, почему результат, который я хочу, «привет», начинается с буквы «b», а после нее ставится новая строка?
Я использую Python 3.3
>>> import subprocess
>>> print(subprocess.Popen("echo hi", shell=True,
stdout=subprocess.PIPE).communicate()[0])
b'hi\n'
Этот дополнительный 'b' не появляется, если я запускаю его с помощью python 2.7
python
subprocess
popen
воображающий
источник
источник
echo hi
печатаетhi\r\n
. Чтобы этого избежать, вы можете добавить .strip () в конце или подобное исправление.check_output()
вместо.communicate()
здесь:print(subprocess.check_output("echo hi", shell=True, universal_newlines=True), end="")
Ответы:
Команда echo по умолчанию возвращает символ новой строки
Сравните с этим:
print(subprocess.Popen("echo -n hi", \ shell=True, stdout=subprocess.PIPE).communicate()[0])
Что касается символа b перед строкой, это означает, что это последовательность байтов, которая эквивалентна обычной строке в Python 2.6+.
http://docs.python.org/3/reference/lexical_analysis.html#literals
источник
Значок
b
указывает на то, что у вас естьbytes
двоичная последовательность байтов, а не строка символов Юникода. Подпроцессы выводят байты, а не символы, вот что иcommunicate()
возвращается.bytes
Тип непосредственно не вprint()
состоянии, так что вы время показалиrepr
изbytes
вас есть. Если вы знаете кодировку байтов, полученных от подпроцесса, вы можете использовать ихdecode()
для преобразования в печатную формуstr
:>>> print(b'hi\n'.decode('ascii')) hi
Конечно, этот конкретный пример работает, только если вы действительно получаете ASCII из подпроцесса. Если это не ASCII, вы получите исключение:
>>> print(b'\xff'.decode('ascii')) Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0…
Новая строка является частью
echo hi
вывода.echo
его задача - вывести переданные вами параметры с последующим переводом строки. Если вас не интересуют пробелы вокруг вывода процесса, вы можете использоватьstrip()
так:>>> b'hi\n'.strip() b'hi'
источник
os.popen
возвращает текстовые строки, есть ли способ заставить ихsubprocess.Popen
также возвращать их вместо байтовых строк.universal_newlines
которая заставляетPopen
объект принимать и возвращать текстовые строки.check_output("dir")
, извлечение имени файла из вывода и последующая попытка получить к нему доступ с помощьюopen
завершится ошибкой, если имя файла содержит немецкие умляуты. Может быть ошибка.Как упоминалось ранее,
echo hi
действительно возвращаетhi\n
, что является ожидаемым поведением.Но вы, вероятно, захотите просто получить данные в «правильном» формате и не заниматься кодированием. Все, что вам нужно сделать, это передать
universal_newlines=True
опцию "subprocess.Popen()
Нравится":>>> import subprocess >>> print(subprocess.Popen("echo hi", shell=True, stdout=subprocess.PIPE, universal_newlines=True).communicate()[0]) hi
Таким образом
Popen()
, эти ненужные символы будут заменены самостоятельно.источник
universal_newlines=True
работал как шарм. Это должен быть принятый ответ, по моему скромному мнению ...universal_newlines=True
inPopen
(чтобы избавиться отb''
), так и astrip()
в результирующей строке, если вы хотите обрезать завершающуюся новую строку.universal_newlines
что теперь это просто обратно совместимый псевдоним дляtext
параметра, который более понятен, но только в Python 3.7 и выше.b - это байтовое представление, а \ n - результат вывода эха.
Далее будут напечатаны только данные результата
import subprocess print(subprocess.Popen("echo hi", shell=True,stdout=subprocess.PIPE).communicate()[0].decode('utf-8').strip())
источник