Python разница между sys.stdin и stdout подпроцесса - PullRequest
0 голосов
/ 28 января 2020

В настоящее время у меня есть более серьезная проблема, поэтому я начал с попытки сопоставить меньшие различия, чтобы посмотреть, исправит ли это мою проблему.

В моей программе я использовал трубу и выполнял эту итерацию ввод через sys.stdin. Я заметил, что это тип <class '_io.TextIOWrapper'>. Я пытаюсь избежать использования канала и заменил свой код, чтобы использовать вместо него subprocess.run() и заметил, что результат имеет тип <class 'str'>.

Это может быть действительно глупый вопрос, но мне интересно почему они разные, и если я могу получить стандартный вывод подпроцесса того же типа, что и sys.stdin.

Использование Python 3.7.5

Ответы [ 2 ]

0 голосов
/ 28 января 2020

subprocess.run возвращает экземпляр CompletedProcess, когда собранные stdout / stderr перехвачены одновременно.

Если вы хотите создать поток, создайте экземпляр Popen, который будет иметь stdout и stderr атрибуты, которые действуют как sys.stdin, и stdin атрибут, который действует как sys.stdout. Но остерегайтесь проблем с буферизацией / тупиком, если вы делаете что-то необычное.

0 голосов
/ 28 января 2020

Вы сравниваете яблоки и апельсины. содержимое из sys.stdin является str экземплярами (хотя вы можете настроить его на возвращение bytes, довольно кропотливо; subprocess в Python 3.x возвращает bytes, если вы не укажете text=True или аналогичный для декодирования этих байтов в str).

Python 3.7.2 (default, Jan 29 2019, 13:41:02) 
[Clang 10.0.0 (clang-1000.10.44.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> type(sys.stdin)
<class '_io.TextIOWrapper'>
>>> line = sys.stdin.readline()
fnord
>>> type(line)
<class 'str'>
>>> import subprocess
>>> s = subprocess.run(['true'], capture_output=True, text=True)
>>> type(s)
<class 'subprocess.CompletedProcess'>
>>> type(s.stdout)
<class 'str'>
...