I need to time the operation of a command-line utility (specifically nslookup) 
from within a python program I'm writing.  I don't want to use python's timeit 
function because I'd like to avoid python's subprocess creation overhead.  That 
leads me to the standard UNIX time function.  So for example, in my bash shell, 
if I enter:

        $ time nslookup www.es.net 8.8.4.4

I get:

        Server:         8.8.4.4
        Address:        8.8.4.4#53

        Non-authoritative answer:
        www.es.net      canonical name = www3.es.net.
        Name:   www3.es.net
        Address: 128.55.22.201

         real   0m0.069s
         user   0m0.006s
         sys    0m0.004s 

The first lines are the result of an nslookup of the IP address of "www.es.net" 
using the server at 8.8.4.4 (Google's public DNS server b).
The last three lines are what I'm after: the real elapsed wall-clock time, the 
time spent in user space and the time spent in kernel space.

However, if I try the same operation in the python interpreter using 
subprocess.Popen like so:

>>> import subprocess
>>> result = subprocess.Popen(['time', 'nslookup', 'www.es.net', '8.8.4.4'], 
>>> shell = False, stdout = subprocess.PIPE, stderr = 
>>> subprocess.PIPE).communicate()
>>> print result
('Server:\t\t8.8.4.4\nAddress:\t8.8.4.4#53\n\nNon-authoritative 
answer:\nwww.es.net\tcanonical name = 
www3.es.net.\nName:\twww3.es.net\nAddress: 128.55.22.201\n\n', '        0.06 
real         0.00 user         0.00 sys\n')

And the timing information I'm after has been truncated to two digits after the 
decimal.  It appears that Popen is applying a default format. If I do explicit 
formatting:

>>> time = result[1].lstrip().split(' ')[0]
>>> formatted_time = '{: >7.3f}'.format(float(time))
>>> print formatted_time
  0.060

I get three digits, BUT that third digit isn't real, the format operation has 
simply appended a zero.  So:

1) how can I recover that third digit from the subprocess?
2) is there a more pythonic way to do what I'm trying to do?

python 2.7, OS-X 10.8.2

Thanks in advance -
Bill Wing

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to