简体   繁体   中英

input directly in process.communicate() in subprocess library

I want to use both multiline input for command 'cat -' and single line input in 'pwd'.

For that i am trying to get input directly in process.communicate() , I am getting broken pipe error. What shall i replace in the argument passed?

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))

This code gets error:

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'
[vibhcool@localhost try]$ Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>
BrokenPipeError: [Errno 32] Broken pipe

process.communicate() expects string which you have encoded() to bytes and it returns bytes which you have to decode() to string.

You use process.stdin which is not string. It even doesn't have method read() to do process.communicate(process.stdin.read()) (besides using process.stdin with the same process makes no sense). It could be rather process.communicate(other_process.stdout.read()) (if you have other process)

Working example - I send text with numbers to command sort and it returns text with sorted numbers.

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

Code

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))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM