pseudo terminal usage from Python?

skip at pobox.com skip at pobox.com
Tue Dec 23 08:41:24 EST 2008


I ran into an interesting problem yesterday.  The mpstat(1) command on
Solaris formats its output like so:

  CPU minf mjf xcal  intr ithr  csw icsw migr smtx  srw syscl  usr sys  wt idl
    0   42   1 1184   812  265  227   12   44   37    0  1131    6   2   0  93
    1   25   1  933   447    2  203   37   75   12    0   902    5   4   0  91
    2   17   0  195   495    1  201   41   77   13    0   514    5   1   0  94
    3    4   0  117   882  405  171   34   65   21    0   449    5   2   0  93

I'm only interested in presenting the CPU numbers and user+sys values
prefixed by a timestamp.  For example, the above might be formatted like so:

    07:28:46.373328 0 8 1 9 2 6 3 7

The obvious solution might be something simple like this:

    mpstat 1 | python mympstat.py

where mympstat.py does a trival amount of reformatting.

The problem is that mpstat recognizes when its output is a pipe and block
buffers it so the Python script sees input in massive blobs, not the
second-by-second output you'd see running "mpstat 1" by itself.  I've been
reduced to a much more complicated solution which involves forking mpstat
with output to a file, then reading the end of that file every second.  A
three-line Python script balloons into a one-page script.  Yuck.  Add to
that I'm writing this for an admin who is considering Python as a scripting
language.   Double Yuck.  (But not nyuk nyuk, this is not the Stooges.)

I suspect there is some magic I can perform with pseudo terminals (this is
on Solaris 10.)  The documentation for the pty module contains no examples
and I've been so far unable to find any using Google.

Any pointers/examples?  I will gladly add an example to the pty module docs
(I have the power!) once I have a couple working examples (maybe one example
each of reading and writing?)

Thanks,

-- 
Skip Montanaro - skip at pobox.com - http://smontanaro.dyndns.org/



More information about the Python-list mailing list