2016-05-22 10 views
2

Ich schreibe ein einfaches Python-Skript unter Linux, um eine Charge von gleichzeitigen einzelnen Pings an Hosts in meinem Subnetz mit subprocess zu tun.python subprocess.call Argumente Problem

manuell der Befehl funktioniert: ping -c 1 192.168.68.1

Das Skript ::

#!/usr/bin/python 
from subprocess import call 

path = "ping" 
flags = "-c 1 " 

for i in range(1,3): 
    ip_addr = "192.168.68." + str(i) 
    args = flags + ip_addr 

    print "doing: {} {}".format(path, args)   
    call([path, args]) 

Anruf kommentiert out gibt die erwarteten:

doing: ping -c 1 192.168.68.1 
doing: ping -c 1 192.168.68.2 

Mit call(), das Skript scheint ping zu nennen, aber mit unbekannten Argumenten. Ausgabe wie folgt:

doing: ping -c 1 192.168.68.1 
Usage: ping [-aAbBdDfhLnOqrRUvV64] [-c count] [-i interval] [-I interface] 
     [-m mark] [-M pmtudisc_option] [-l preload] [-p pattern] [-Q tos] 
     [-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option] 
     [-w deadline] [-W timeout] [hop1 ...] destination 
Usage: ping -6 [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface] 
     [-l preload] [-m mark] [-M pmtudisc_option] 
     [-N nodeinfo_option] [-p pattern] [-Q tclass] [-s packetsize] 
     [-S sndbuf] [-t ttl] [-T timestamp_option] [-w deadline] 
     [-W timeout] destination 
doing: ping -c 1 192.168.68.2 
Usage: ping [-aAbBdDfhLnOqrRUvV64] [-c count] [-i interval] [-I interface] 
     [-m mark] [-M pmtudisc_option] [-l preload] [-p pattern] [-Q tos] 
     [-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option] 
     [-w deadline] [-W timeout] [hop1 ...] destination 
Usage: ping -6 [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface] 
     [-l preload] [-m mark] [-M pmtudisc_option] 
     [-N nodeinfo_option] [-p pattern] [-Q tclass] [-s packetsize] 
     [-S sndbuf] [-t ttl] [-T timestamp_option] [-w deadline] 
     [-W timeout] destination 

Es scheint ping für jede Iteration zweimal aufgerufen wird mit verschiedenen args zu dem, was ich erwarte. Ich notiere das -6 Argument ping beschwert sich über.
Ich würde jede Hilfe, besonders im Hinblick auf die Verwendung von call() richtig zu schätzen wissen.

Update:
Added Bash-Skript ich versucht bin zu emulieren:

#!/bin/bash 
for ip in $(seq 1 2); do 
    ping -c 1 192.168.68.$ip & 
done 
+3

'call ([Pfad, flags.strip(), ip_addr]) ' – ozgur

Antwort

2

Die Argumente der Funktion übergeben call sollten jeweils ein einzelnes Element in einer Liste sein, wie zum Beispiel:

call(['ping','-c','1','192.168.68.2']) 

Ich konnte den 'doppelten Druck' in meiner Umgebung nicht reproduzieren.

+0

Hallo Pablo, ich habe versucht ' flags = ["-c", "1"] ' und dann versucht, in der call() ' Aufruf ([Pfad, * Flags, ip_addr]) 'zu entpacken Ich bekomme Syntaxfehler. Ist es nicht möglich, innerhalb des Arrays zu entpacken? – user1330734

+1

@ user1330734: Es ist Python 3.5 + Syntax. – jfs

+0

@ J.F. Sebastian Interessanterweise scheint der Python-Code synchron zu sein, d. H. Jeder Ping-Aufruf scheint auf eine vorherige Beendigung zu warten. Im Gegensatz dazu dauert das Forking-Bash-Skript, das ich oben hinzugefügt habe, ungefähr 5 Sekunden, um IP-Bereich 1-254 auszuführen. – user1330734

0

Wie @Pablo erwähnt flags und path Variablen sollte eine Liste Elemente, also bevor die call Methode aufrufen einfach Ihre Befehlsfolge zur Liste konvertieren:

path = "ping" 
flags = "-c 1" 
cmd_list = [path] # convert string to list 
cmd_list = cmd_list + flags.split(' ') # converting your flags string to list elements 

call(cmd_list)