from subprocess import PIPE,Popen
p = Popen("ls -l",shell=True,stderr=PIPE,stdout=PIPE)
(out,err) = p.communicate()
print(out, err)
В приведенном выше вызове Popen, если я удалю stdout=PIPE
, я получаю новую строку после каждого перечисления на ls -l
в выводе. Но если использовать stdout=PIPE
, у меня будет отображаться \n
, а не новая строка, как показано ниже.
b'total 67092\n-rw-r--r-- 1 root root 171 May 27 09:08 new.py\n-rw-r--r-- 1
root root 74 May 12 18:14 abcd.conf\n-rwxr-xr-x 1 root root 5948 May 13 13:21 abxyz.sh\ndrwxr-xr-x 2 root root 4096 May 13
12:39 log\ndrwxrwxrwx 3 root root 4096 May 14 16:02
newpy\n-rw-r--r-- 1 root root 134 May 27 10:13
pipe.py\n-rw-r--r-- 1 root root 155 May 27 10:07
proc.py\ndrwxrwxrwx 3 root root 4096 May 14 14:29 py\ndrwxr-xr-x
16 1000 1000\n' b''
Как точно работает PIPE
в случае subprocess.Popen
? Зачем нам это нужно? Я получил нормальный вывод без его использования? Используем ли мы это для получения как stderr, так и stdout?
1 ответ
Удалите вызов print()
, чтобы увидеть разницу.
Если вы не передаете вывод ls
в Python, он вместо этого отображается непосредственно на вашем терминале; его вывод идет на ваш терминал. Если вы передадите его на Python, вы увидите все содержимое как байты, включая байты новой строки (представленные как \n
).
Расшифруйте результаты, если хотите, чтобы символы новой строки печатались буквально:
print(out.decode('utf8'))
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.
stdin
без ТРУБЫ?stdout=PIPE
на экране не отображается stderr. Почему? не следует ли только PIPE stdout и display stderr.ls
записывает в дескриптор файлаstdout
, который, когда вы его не используете, напрямую подключается к вашему терминалу. Когда вы перенаправляете его в Python, вы захватываете все, что ему пишетls
.ls
не ничего пишетstderr
. Когда вы используетеPIPE
дляstderr
, вы видите, что ваша переменнаяerr
пуста (b''
- это пустое байтовое значение).stderr=PIPE
в Popen иprint(err)
, я получаюNone
в выводе дляerr
. Мой вопрос заключался в том, почему этотNone
не отображается прямо на экране. Потому что он отображался без PIPE для stdout и stderr.