我有一个从某个设备获取输入流的 linux 应用程序。该输入应定向到 shell 进程,以便它向用户模拟标准 shell。到目前为止,我已经通过创建一个运行“/bin/sh”的进程来完成它,并将其输入、输出和 stderr 重定向如下:
import subprocess
p = subprocess.Popen(shell=False, args=['/bin/sh'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
_make_nonblocking(p.stdout) # sets O_NONBLOCK
_make_nonblocking(p.stderr)
当我只是一个 pass 命令时,一切正常:
p.stdin.write('pwd\n')
p.stdout.read()
'/home/dave\n'
对于自动完成,我尝试编写:
p.stdin.write('ls s\t')
p.stdout.read()
IOError: [Errno 11] Resource temporarily unavailable
我希望得到一个可能完成的列表,但是在我将 '\n' 放入标准输入之前什么都没有发生。(此外,stderr 中没有任何等待)。
我查看了 telnetd 代码并看到了 pty 的使用。我尝试使用 pty.openpty() 并将 slave 设置为标准输入,但这也不起作用。应该怎么做?
更新:我按照建议使用了 -i 参数。现在我有一个问题,一旦我使用 Popen 并按 ENTER,python shell 就会移动到后台,如下所示:
>>> p = subprocess.Popen(shell=False, args=['/bin/sh', '-i'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> <ENTER>
[1]+ Stopped ipython
$