2015-11-20 2 views
2

В Python 2.7, это работает и возвращает требуемую строку it works!Python 3 подпроцесс блоки труб

process = subprocess.Popen(['/bin/bash'], shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
process.stdin.write('echo it works!\n') 
print process.stdout.readline() 

Когда я знаю, попробовать это в Python 3.4 она застревает в команде Readline

process = subprocess.Popen(['/bin/bash'], shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
process.stdin.write(bytes('echo it works!\n','UTF-8')) 
print(process.stdout.readline().decode('UTF-8')) 
+0

Может быть, это помогает, http://stackoverflow.com/questions/7585435/best-way-to-convert-string-to-bytes-in-python-3 –

+2

я с удивлением обнаружил, что добавление 'process.stdin.flush()' исправляет проблему. Я думал, что это будет строка буферизации. – tdelaney

+0

Проверьте [это] (http://stackoverflow.com/questions/163542/python-how-do-i-pass-a-string-into-subprocess-popen-using-the-stdin-argument) и [это] (http://stackoverflow.com/questions/8652767/python3-subprocess-communicate-example). Также комментарий @ tdelaney ... –

ответ

2

подсказка о буферизации полезна. Следующая информация может быть найдена в документации модуля библиотеки подпроцесса:

BUFSIZE будет поставляться в качестве соответствующего аргумента в открытой() функции при создании объектов файла STDIN/STDOUT/STDERR труб:

0 означает небуферизован (чтение и запись в один системный вызов может возвращать короткие)

1 означает линию буферизованный (только полезной, если universal_newlines = True т.е., в текстовом режиме)

и

Если universal_newlines является Ложные объекты файл STDIN, STDOUT и STDERR будут открыты в виде двоичных потоков, а не строка, заканчивающаяся преобразование не делается.

Если universal_newlines это правда, эти объекты файла будут открыты потоками текста в режиме универсального Newlines, используя кодировку, возвращенное locale.getpreferredencoding (False)

Собирает все вместе дает следующий Python3 код:

import subprocess 
process = subprocess.Popen(['/bin/bash'], shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE, bufsize=1, universal_newlines=True) 
process.stdin.write('echo it works!\n') 
print(process.stdout.readline()) 
Смежные вопросы