Выдача команд псевдооболочкам (pty)

Я пытался использовать подпроцесс, popen, os.spawn, чтобы запустить процесс, но кажется, что нужен псевдотерминал.

import pty

(master, slave) = pty.openpty()

os.write(master, "ls -l")

Должен отправить «ls -l» подчиненному tty... Я попытался прочитать ответ os.read(master, 1024), но ничего не было доступно.

РЕДАКТИРОВАТЬ:

Также пытался создать pty, а затем открыть вызов в подпроцессе - все равно не сработало.

import pty
import subprocess

(master, slave) = os.openpty()
p = subprocess.Popen("ls", close_fds=True, shell=slave, stdin=slave, stdout=slave)

Похожий:

Отправить команду и выйти, используя процесс псевдотерминала python pty

Как работают псевдотерминалы *nix? Что такое главный/подчиненный канал?


person user791953    schedule 29.01.2014    source источник
comment
Вам не нужен pty для запуска ls. Трубка с этим прекрасно справится. Что ты там пробовал?   -  person Keith    schedule 30.01.2014
comment
Я использую ls для проверки функциональности.   -  person user791953    schedule 30.01.2014
comment
В своем редактировании вы смешиваете pty и pipe. Не делай этого. Используйте тот или иной.   -  person Keith    schedule 30.01.2014
comment
Как мне тогда получить вывод ls в pty?   -  person user791953    schedule 30.01.2014
comment
Я предлагаю использовать forkpty и os.read() из возвращенного файлового дескриптора. Вот пример proctools.py.   -  person Keith    schedule 30.01.2014


Ответы (1)


Используйте pty.spawn вместо os.spawn. Вот функция, которая запускает команду в отдельном pty и возвращает результат в виде строки:

import os
import pty

def inpty(argv):
  output = []
  def reader(fd):
    c = os.read(fd, 1024)
    while c:
      output.append(c)
      c = os.read(fd, 1024)

  pty.spawn(argv, master_read=reader)
  return ''.join(output)

print "Command output: " + inpty(["ls", "-l"])
person that other guy    schedule 29.01.2014
comment
В Python 3 замените return на: return b''.join(output).decode('utf-8') - person AviFS; 31.01.2021