2010-07-07 23 views
1

Je m'occupe d'un serveur Virtuozzo et je veux automatiser la journalisation dans chaque conteneur et émettre quelques commandes en Python en créant un sous-processus pour 'vzctl enter'.Virtuozzo et automatisation des commandes avec les sous-processus de Python

Voici l'extrait que je travaille en ce moment -

#!/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' 

Mais la sortie que je vois à chaque fois est -

Unable to get term attr: Invalid argument 
Unable to restore term attr: Invalid argument 

Je pense vraiment que cela est une erreur de BASH, quelqu'un peut-il donnez-moi une suggestion?

+0

Légèrement offtopic: Je vous recommande d'utiliser Popen (['vzctl', 'enter', '123'], ..., shell = False). –

Répondre

2

On dirait que vzctl s'attend à ce que stdin/stdout soit un terminal. Vous pouvez savoir qui en expérimentant (en bash):

$ echo whoami | vzctl enter 123 # stdin is not a tty 

$ vzctl enter 123 | cat   # stdout is not a tty 
whoami 
<ctrl-d> 

Vous pouvez utiliser le module pty de la bibliothèque standard pour créer pseudottys, mais ce module est très bas niveau.

Il existe un module tiers appelé pexpect qui pourrait répondre à la facture.

+0

La première commande a produit les mêmes erreurs - je vais essayer d'utiliser votre pexpect et vous le faire savoir. Merci. – sholsapp