2012-10-24 2 views
0

Le problème est que le processus n'est pas démarré. L'objet est créé, mais il y a et il n'y avait pas de processus.Popen confusion - rediriger la sortie, les méthodes ne fonctionnent pas

Si je mets un time.sleep() avant l'instruction os.kill, je perds le contrôle. Le processus commence, mais il n'est pas tué. De plus, mon stdout est perdu. Tout ce que je tape n'apparaît pas (je suppose que ça va aussi à zéro). Je dois fermer le terminal, ouvrez une nouvelle, et de tuer le processus manuellement (à partir de python et l'émission cette commande exacte fait le travail, ce qui est bon à savoir)

airodump = subprocess.Popen('airodump-ng -w outputfile mon0',shell=True,stdout=open('/dev/null', 'w'), stderr=open('/dev/null', 'w')) 
#time.sleep(5) 
os.kill(airodump.pid, signal.SIGTERM) # airodump-ng 
#airodump.wait() 
print airodump 

J'ai essayé d'invoquer les méthodes Popen .terminate(), Popen.kill(). Il me manque quelque chose avec Popen ....

Même lorsque je mets un Popen.wait() avant "print airodump" il est simplement contourné et l'adresse de l'objet est imprimée. Cette petite bizarrerie est ce qui m'a convaincu que quelque chose ne va pas dans ma compréhension de ce qui se passe.

+0

où voulez-vous aller à stdout? Vous dites que c'est perdu mais vous l'envoyez '/ dev/null'. –

+0

Je ne m'inquiète pas où stdout va, juste faire cela pour plus de commodité. tout ce que je veux, c'est que airodump fonctionne pendant quelques secondes, puis arrête (tue le processus), et la fonctionnalité soit retournée au programme. – ojef

+0

tout ce qui m'importe est le fichier qui est généré. Je trouve juste intéressant que stdout étant envoyé à null "porte" – ojef

Répondre

3

Vous devriez essayer:

airodump = subprocess.Popen(['airodump-ng', '-w', 'outputfilename', 'mon0'], 
          stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
time.sleep(secs) 
airodump.terminate() 
return_code = airodump.wait() 

avis J'ai remplacé votre chaîne de commande avec une liste, a laissé tomber le shell = True et les choses stdout. First shell = True rend tout plus difficile à déboguer donc vous devriez essayer de l'exécuter sans cela, mais pour ce faire, vous devrez utiliser une liste pour votre commande et non une chaîne.

La méthode la plus standard pour capturer stdout/stderr et les empêcher de passer à l'écran est d'utiliser stdout=subprocess.PIPE. Si vous ne parvenez toujours pas à obtenir ce résultat, essayez de vérifier airodump.stdout et airodump.sterr pour voir ce qui se passe avec votre processus. J'espère que c'est suffisant pour vous aider à démarrer.

+0

Oh mon. ça a marché. Quelqu'un a suggéré de supprimer shell = true, mais je n'ai pas réalisé que la commande devait être dans une liste (j'ai reçu un message d'erreur, je n'ai pas compris pourquoi). Merci beaucoup monsieur – ojef

+0

je voterais, mais ma réputation est trop faible – ojef

Questions connexes