2017-04-23 1 views
0

Ich versuche, eine Funktion get_ethname in eine andere Funktion get_ethSpeed aufrufen, aber ich kann nicht verstehen, wie es aufgerufen wird.So rufen Sie eine Funktion in eine andere Funktion in Python 2.6

Vielen Dank für Ihre Eingaben in Advanced.

The output of the first function returns the name of the NIC interface on the system as below..

[[email protected]/]# cat intDetail1.py 
#!/usr/bin/python 
import ethtool 

def get_ethname(): 
    inames = ethtool.get_devices() 
    inameCurr = inames[1] 
    print inameCurr 
    return inameCurr 

def main(): 
    get_ethname() 

main() 
[[email protected] /]# ./intDetail1.py 
eth0 

Below is the main code where i'm trying to call it.

#!/usr/bin/python 
    import ethtool 
    import subprocess 

    def get_ethname(): 
     inames = ethtool.get_devices() 
     inameCurr = inames[1] 
     print inameCurr 
     return inameCurr 

    def get_ethSpeed(): 
     spd = subprocess.popen("['ethtool', 'get_ethname']", stdout=subprocess.PIPE).communicate()[0] 
     print spd 
     return spd 

    def main(): 
     get_ethname() 
     get_ethSpeed() 

    main() 

When i run the above code it gives the below error .

File "/usr/lib64/python2.6/subprocess.py", line 1234, in _execute_child 
    raise child_exception 
OSError: [Errno 2] No such file or directory 

ist mein Ziel, auf den Systemen zur Hauptlauf Interface-Namen bekommen und und erhalten dann die Geschwindigkeit unter Verwendung von Linux-System-Utility des NIC bestimmt ethtool welches die Geschwindigkeit des Interfaces angibt:

[[email protected] /]# /sbin/ethtool eth0| grep Speed 
       Speed: 1000Mb/s 

Output look of ethtool eth0 is Below:

[[email protected] /]# ethtool eth0 
Settings for eth0: 
     Supported ports: [ TP ] 
     Supported link modes: 10baseT/Half 10baseT/Full 
           100baseT/Half 100baseT/Full 
           1000baseT/Full 
     Supported pause frame use: No 
     Supports auto-negotiation: Yes 
     Advertised link modes: 10baseT/Half 10baseT/Full 
           100baseT/Half 100baseT/Full 
           1000baseT/Full 
     Advertised pause frame use: No 
     Advertised auto-negotiation: Yes 
     Speed: 1000Mb/s 
     Duplex: Full 
     Port: Twisted Pair 
     PHYAD: 1 
     Transceiver: internal 
     Auto-negotiation: on 
     MDI-X: Unknown 
     Supports Wake-on: g 
     Wake-on: g 
     Link detected: yes 
+0

Wie lauten die Dateinamen und ihre Baumstruktur/Beziehung? –

+1

'popen' benötigt eine Liste von Argumenten. Sie haben stattdessen eine Zeichenfolge angegeben. Entfernen Sie die Anführungszeichen und es sollte in Ordnung sein. Außerdem wird 'python2.6' nicht mehr unterstützt. Sie sollten lieber früher als später zu 'python2.7' oder besser' python3' wechseln. –

+0

@DaniSpringer, Sorry, ich konnte deine Frage nicht genau beantworten. Ich versuche nur, das 'eth0' mit' ethtool'-Befehl zu erhalten, was der Linux-Systembefehl ist, also, dass die zweite Funktion die Ausgabe von '/ sbin/ethtool eth0' ausgeben muss. Im Code werden keine Dateien aufgerufen. – krock1516

Antwort

1

No such device Settings for get_ethname(): No data available

Dieses immer noch das gleiche Problem mit der ursprünglichen Frage. Sie übergeben eine Literalzeichenfolge und erwarten, dass die Shell die Python-Funktion aufruft?

Es gibt keine hier zitiert, außer um den eigentlichen Shell-Befehl

spd = subprocess.Popen(['/sbin/ethtool', get_ethname()], stdout=subprocess.PIPE).communicate()[0] 

Oder eine andere Variable machen

iface = get_ethname() 
# Or 
iface = ethtool.get_devices()[1] 

spd = subprocess.Popen(['/sbin/ethtool', iface], stdout=subprocess.PIPE).communicate() 
return spd[0] 

Beachten Sie, dass Sie noch grep müssen (oder die Ausgabe mit Python-Scan) für "Geschwindigkeit"

+0

cricket_007 ..... Sie haben es richtig gefangen, obwohl ich diese wörtliche Zeichenfolge bereits entfernt habe, aber ich habe es versäumt, die Anführungszeichen um die Funktion zu entfernen, die ich nach Ihrer Antwort bemerkt habe. Obwohl die echte Soße immer noch freigestellt werden muss :) das "Speed" -Ding. Danke für deine Eingaben. Wäre super, irgendwas daran. – krock1516

+0

Sie könnten den Subprozess zu einem anderen Subprozess leiten, der grep verwendet, oder Regex verwenden, oder die Zeilen dieses Outputs durchlaufen –

+0

cricket_007 .. danke für den Hinweis, bitte editieren Sie auch 'popen' in' Popen', was ein Tippfehler ist in dem Code, den Sie zur Verfügung gestellt haben, falls jemand das kopieren sollte. – krock1516

Verwandte Themen