Comment puis-je effectuer un ping ou traceroute en python, l'accès à la sortie, car il est fabriqué?
Plus tôt, j'ai posé cette question:
Comment puis-je effectuer un ping ou traceroute à l'aide de code python?
Cependant parce que python n'est pas exécuté en tant que root, il se complique pas la capacité d'ouvrir les raw ICMP sockets nécessaires pour exécuter la commande ping/traceroute en natif python.
Cela me ramène à l'aide du système de ping/traceroute des commandes shell. Cette question a un couple d'exemples qui utilisent la subprocess
module qui semblent bien fonctionner:
J'ai toujours un plus d'exigence bien: j'ai besoin d'être en mesure d'accéder à la sortie qu'elle est produite (par exemple. pour un long exécutant la commande traceroute.)
Les exemples ci-dessus exécutez la commande shell, puis seulement vous donner accès à la totalité de sortie une fois que la commande est terminée. Est-il un moyen d'accéder à la sortie de la commande qu'elle est produite?
Edit: Basé sur Alex Martelli réponse, voici ce qui a fonctionné:
import pexpect
child = pexpect.spawn('ping -c 5 www.google.com')
while 1:
line = child.readline()
if not line: break
print line,
Vous devez vous connecter pour publier un commentaire.
pexpect est ce que j'aimerai atteindre pour, "par défaut", pour toute exigence telle que la vôtre, il y a d'autres modules similaires, mais pexpect est presque toujours la plus riche, la plus stable, et plus mature. Le seul cas où j'aurais la peine de rechercher des solutions de rechange si j'avais à exécuter correctement sous Windows (où ping et traceroute peut ont leurs propres problèmes, de toute façon) -- laissez-nous savoir si c'est le cas pour vous, et nous allons voir ce qui peut être organisé!-)
Vous devriez lire la documentation pour la sous-processus module, il décrit comment exécuter un processus externe et d'accéder à sa sortie en temps réel.
Fondamentalement, vous ne
En fait, les réponses dans la question que vous avez lié sont très proche de ce que vous avez besoin. Corey Goldberg réponse utilise un tuyau et
readline
, mais depuis qu'il exécute la commande ping avec-n 1
il ne dure pas assez longtemps pour faire une différence.Vous pouvez créer un ats paire pour le sous-processus et de les exécuter à l'intérieur de ça. Selon la norme C (C99 7.19.3) la seule fois que stdout est de la ligne de mémoire tampon (par opposition à avec tampon qui est ce que vous dites que vous ne voulez pas), c'est quand c'est un terminal. (ou de l'enfant appelé setvbuf() bien évidemment).
Découvrez os.openpty().
Code non testé:
Notez que le processus de l'enfant (juste après le fork()) appel setvbuf() va pas travail, depuis setvbuf() est une fonction de la libc et pas un syscall. Il change juste de l'état actuel du processus de sortie, qui sera remplacé sur le exec appel lorsque le nouveau binaire chargé.
Ici est une autre approche:
Exemple d'utilisation:
traceroute:
ping:
haut: