向伪shell发出命令(pty)

时间:2014-01-29 20:52:07

标签: python shell pty

我尝试使用子进程popen,os.spawn来运行进程,但似乎需要一个伪终端。

import pty

(master, slave) = pty.openpty()

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

应该将“ls -l”发送给slave 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)

类似:

Send command and exit using python pty pseudo terminal process

How do *nix pseudo-terminals work ? What's the master/slave channel?

1 个答案:

答案 0 :(得分:2)

使用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"])