我正在处理Virtuozzo服务器,并希望通过为'vzctl enter'创建子进程来自动登录每个容器并在Python中发出一些命令。
以下是我正在处理的片段 -
#!/usr/bin/python
import subprocess
print 'Start'
proc = subprocess.Popen(['vzctl enter 123'],
stdout=subprocess.PIPE,
stdin=subprocess.PIPE,
shell=True)
print proc.communicate('whoami')[0]
print 'Finished'
但我每次看到的输出都是 -
Unable to get term attr: Invalid argument
Unable to restore term attr: Invalid argument
我真的认为这是一个BASH错误,任何人都可以给我一个建议吗?
答案 0 :(得分:2)
看起来vzctl希望stdin / stdout成为终端。您可以通过试验(在bash中)找出哪个:
$ echo whoami | vzctl enter 123 # stdin is not a tty
$ vzctl enter 123 | cat # stdout is not a tty
whoami
<ctrl-d>
您可以使用标准库中的pty
模块来创建pseudottys,但该模块的级别非常低。
有一个名为pexpect
的第三方模块可能适合该法案。