0

I'm trying to call a function get_ethname into another function get_ethSpeed, but i'm unable to understand how to get it called.

Many thanks for your inputs in advanced.

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

[root@tss/]# 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()
[root@tss /]# ./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

My aim is get to main running interface name on the systems and and then get the speed determine of the NIC by using linux system utility ethtool which tells the speed of the Interface:

[root@tss /]# /sbin/ethtool eth0| grep Speed
              Speed: 1000Mb/s

Output look of ethtool eth0 is Below:

[root@tss /]# 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
14
  • What are the file names and their tree structure/relation? Commented Apr 23, 2017 at 11:46
  • 1
    popen requires a list of args. You have given it a string instead. Remove the double quotes and it should be fine. Furthermore, python2.6 is no longer supported. You should move over to python2.7 or preferably python3 sooner rather than later. Commented Apr 23, 2017 at 11:51
  • @DaniSpringer, Sorry i could not get your question exactly, though. I am Just trying to get the eth0 to be received with ethtool command which is linux system command so, saying that the second function needs to fetch the output of /sbin/ethtool eth0 output. There is not files called in the code. Commented Apr 23, 2017 at 11:55
  • 1
    Also, get_ethname needs to call the function you defined so: spd = subprocess.popen(['/sbin/ethtool', get_ethname()], stdout=subprocess.PIPE).communicate()[0] Commented Apr 23, 2017 at 12:04
  • 1
    @DaniSpringer, nice to have your inputs. Commented Apr 23, 2017 at 12:43

1 Answer 1

1

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

This is still the same problem with the original question. You're passing a literal string and expecting the shell to invoke the Python function?

There's no quotes here except around the actual shell command

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

Or, make another variable

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

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

Note that you'll still need to grep (or scan the output with python) for "Speed"

Sign up to request clarification or add additional context in comments.

4 Comments

cricket_007..... You correctly caught it, though i removed those literal string already but i missed to remove the quotes around the function which i realized after your answer. Though the real sauce still need to be extarcted :) that "Speed" thing. Thanks for your inputs.. Would be great any hist on that.
You could pipe the subprocess to another subprocess that uses grep, or use regex, or loop over the lines of that output
cricket_007 .. thanks for the hint, also please edit the popen into Popen which is a typo error in the code you provided, in case someone copy paste that.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.