2010-06-23 4 views
2

J'utilise le module de sous-processus python pour exécuter une commande et stocker sa sortie en arrière-plan. La commande est déployée sur ma machine. Maintenant, chaque fois que je lance la commande à partir de l'invite du shell, cela fonctionne très bien. Mais lorsque je tente d'exécuter la même commande en utilisant le module sous-processus, il donne l'erreur suivantecommande en cours en arrière-plan

La commande à exécuter est vxswadm listswitch all

process = subprocess.Popen('vxswadm listswitch all > tmp.txt &',shell=True)   
>>> Traceback (most recent call last): 
    File "/usr/bin/vxswadm", line 30, in <module> 
    l.uname = os.getlogin() 
    OSError: [Errno 25] Inappropriate ioctl for device 

Quelqu'un peut-il me aider à corriger cette erreur. Toutes les suggestions seront utiles. Merci à l'avance

Tazim

+0

Cela peut être soit la façon dont vous manipulez stdout, ou une erreur survenant dans stdout lui-même. Avez-vous pu exécuter la commande avec succès en dehors de Python? –

+0

La commande yes fonctionne correctement à l'invite du shell – tazim

Répondre

0

Essayez de changer à ['vxswadm', 'listswitch', 'all', '>', 'tmp.txt','&'] et/ou shell changeant False.

Je pense que c'est peut-être le bit shell, si (cela corrige).

Vous pouvez également essayer d'ajouter stdin=subprocess.PIPE, stdout=subprocess.PIPE, bien que je doute que cela l'affectera.

2

Le problème est probablement dû au fait que le shell bash se termine immédiatement après le & et envoie le singal SIGHUP à tous ses sous-processus (comportement de shell standard).

Vous pouvez utiliser le module de sous-processus pour exécuter directement la commande et rediriger la sortie vers tmp.txt en ouvrant d'abord le fichier, puis en passant son handle de fichier à l'argument stdout de l'appel Popen.

Questions connexes