2017-01-05 2 views
0

Я хочу использовать как многострочный вход для команды «cat», так и однострочный ввод в «pwd».вход непосредственно в process.communicate() в библиотеке подпроцессов

Для этого я пытаюсь получить вход непосредственно в process.communicate(), я получаю ошибку обрыва трубы. Что я должен заменить в аргументе?

command = 'cat -' 
stdout_value='' 

process = subprocess.Popen(shlex.split(command), 
        stdin=subprocess.PIPE, 
        stdout=subprocess.PIPE, 
        shell=True) 
while True: 
    if process.poll() is not None: 
    break  
    stdout_value = stdout_value + process.communicate(process.stdin)[0] 

print(repr(stdout_value)) 

Этот код получает сообщение об ошибке:

Traceback (most recent call last): 
    File "try.py", line 67, in <module> 
    stdout_value = stdout_value + process.communicate(process.stdin)[0] 
    File "/usr/lib64/python3.5/subprocess.py", line 1068, in communicate 
    stdout, stderr = self._communicate(input, endtime, timeout) 
    File "/usr/lib64/python3.5/subprocess.py", line 1687, in _communicate 
    input_view = memoryview(self._input) 
TypeError: memoryview: a bytes-like object is required, not '_io.BufferedWriter' 
[[email protected] try]$ Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'> 
BrokenPipeError: [Errno 32] Broken pipe 
+0

, что это 'proc.stdin'? – yedpodtrzitko

+0

@yedpodtrzitko это process.stdin, обновил его: P –

+0

'общаться (« HELLO ».encode ('utf-8'))' – furas

ответ

0

process.communicate() ожидает строку, которая у вас есть encoded() в байтах и ​​возвращает байт, которые вы должны decode() в строку.

Вы используете process.stdin, который не является строкой. У него даже нет метода read() сделать process.communicate(process.stdin.read()) (кроме того, используя process.stdin с тем же process не имеет смысла). Это может быть довольно process.communicate(other_process.stdout.read()) (если у вас есть другой процесс)

Рабочий пример. Я отправляю текст с номерами для ввода sort и возвращает текст с отсортированными числами.

input: 3\n2\n5\n-1 
output: -1\n2\n3\n5\n 

Код

import subprocess 
import shlex 

command = 'sort' 

process = subprocess.Popen(shlex.split(command), 
        stdin=subprocess.PIPE, 
        stdout=subprocess.PIPE, 
        shell=True) 

stdout_value = '' 

while True: 
    if process.poll() is not None: 
     break 
    result = process.communicate("3\n2\n5\n-1".encode('utf-8'))[0] 
    stdout_value += result.decode('utf-8') 

print(repr(stdout_value)) 
Смежные вопросы