Ну, ваш вывод фактически не завершен. Поскольку вы породили /bin/sh
, оболочка все еще работает после завершения "ls". Индикатор EOF отсутствует, потому что он все еще работает.
Почему бы просто не запустить /bin/ls
?
Вы могли бы сделать что-то вроде
pfd = subprocess.Popen(['ls'], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
out, err_output = pfd.communicate()
Это также выделяет subprocess.communicate
, который является более безопасным способом получения выходных данных (для выходов, которые в любом случае помещаются в память) из одного запуска программы. Он вернется только после завершения работы программы.
С другой стороны, вы могли бы читать также из оболочки, но вы искали бы специальную последовательность оболочки, такую как строка sh~#
, которая могла бы легко появиться в выходных данных программы. Таким образом, запуск оболочки, вероятно, является плохой идеей.
Редактировать Вот то, что я имел в виду, но на самом деле это не самое лучшее решение, поскольку у него МНОГО предостережений:
while 1:
c = pfd.stdout.read(1)
if not c:
break
elif c == '\n': # print line when found
print repr(out)
out = ''
else:
out += c
if out.strip() == 'sh#':
break
Обратите внимание, что это произойдет, если любая другая команда выведет 'sh #' в начале строки, а также если по какой-либо причине выходные данные отличаются от ожидаемых, вы войдете в ту же ситуацию блокировки, что и раньше. Вот почему это очень неоптимальная ситуация для оболочки.