1

我正在处理一个 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 错误,任何人都可以给我一个建议吗?

4

1 回答 1

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,但该模块非常低级。

有一个名为 3rd-party 的模块pexpect可能符合要求。

于 2010-07-10T14:01:02.673 回答