Я имею дело с сервером Virtuozzo и хочу автоматизировать вхождение в каждый контейнер, и выдача нескольких команд в Python путем создания подпроцесса для 'vzctl входят'.
Вот отрывок, что я продолжаю работать прямо сейчас -
#!/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, кто-либо может дать мне предложение?
Похоже, что 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
из стандартной библиотеки для создания псевдоттисов, но этот модуль очень низкоуровневый.
Есть модуль 3-й стороны под названием pexpect
, который может соответствовать требованиям.