Виртуоццо и автоматизация команд с подпроцессами Python
-
02-10-2019 - |
Вопрос
Я имею дело с Virtuozzo Server и хочу автоматизировать входа в каждую контейнер и выдавать несколько команд в Python, создавая подпроцесс для «VZCTL Enter».
Вот фрагмент, на котором я сейчас работаю -
#!/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
Это может соответствовать законопроекту.
Не связан с StackOverflow