w...@mac.com 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