[email protected] writes:
> 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:
>
It is unclear to me what overhead you are avoiding.
> $ 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
>
It is possible that the "time" invocation from the shell is invoking
your shell's builtin time implementation, and your python code is
running /usr/bin/time or /bin/time. You should see the same behaviour
from the shell if you run /bin/time or /usr/bin/time (whatever you have)
instead of just "time". subprocess.Popen should never modify the output
of programs it runs.
--
regards,
kushal
--
http://mail.python.org/mailman/listinfo/python-list