Very odd output from subprocess

M

m

I have this function:


def GetMakeOutput(make, rules, out=None):
p = subprocess.Popen('%s %s' % (make,rules),
shell=True,
bufsize=1024,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE,
close_fds=False)
ret = []
line = p.stdout.readline()
while len(line):
if line[:5] not in ['make[','make:']:
if out:
out.write(line)
out.flush()
else:
ret.append(line)
line = p.stdout.readline()
return string.join(map(string.strip,ret),'\n')

Very simple ... it cleans any line that is output from make itself.

Now, I have used it for quite awhile with no problem. But, I noticed
today that it wasn't doing its job on my 64 bit machine.

If I add the line:
for l in line: print ord(l),'\t',l
after the first readline, I get the following:


27 
91 [
48 0
48 0
109 m
27 
91 [
51 3
55 7
109 m

before the codes begin for the string as it appears if I just print
it. So, what is this sequence? They seem like some sort of escape
codes, I've never seen this before at all.

Can anyone enlighten me as to what is going on?

And, can I safely strip sets of 5 characters from the front as long as
they start with Escape (27)?

Thanks,

Mark.
 
C

Chris Rebert

I have this function:


def GetMakeOutput(make, rules, out=None):
   p = subprocess.Popen('%s %s' % (make,rules),
                        shell=True,
                        bufsize=1024,
                        stderr=subprocess.PIPE,
                        stdout=subprocess.PIPE,
                        close_fds=False)
   ret = []
   line = p.stdout.readline()
   while len(line):
       if line[:5] not in ['make[','make:']:
           if out:
               out.write(line)
               out.flush()
           else:
               ret.append(line)
       line = p.stdout.readline()
   return string.join(map(string.strip,ret),'\n')

Very simple ... it cleans any line that is output from make itself.

Now, I have used it for quite awhile with no problem.  But, I noticed
today that it wasn't doing its job on my 64 bit machine.

If I add the line:
    for l in line: print ord(l),'\t',l
after the first readline, I get the following:


27
91      [
48      0
48      0
109     m
27
91      [
51      3
55      7
109     m

before the codes begin for the string as it appears if I just print
it.  So, what is this sequence?  They seem like some sort of escape
codes, I've never seen this before at all.

Can anyone enlighten me as to what is going on?

http://en.wikipedia.org/wiki/ANSI_escape_code

Running make directly, rather than through the shell, might disable
the use of the codes in whatever program is outputting them.
It's worth a try.

Cheers,
Chris
 
N

Nobody

If I add the line:
for l in line: print ord(l),'\t',l
after the first readline, I get the following:


27 
91 [
48 0
48 0
109 m
27 
91 [
51 3
55 7
109 m

before the codes begin for the string as it appears if I just print
it. So, what is this sequence? They seem like some sort of escape
codes, I've never seen this before at all.

<ESC>[00m is the ANSI code to reset attributes to their default state.
Can anyone enlighten me as to what is going on?

And, can I safely strip sets of 5 characters from the front as long as
they start with Escape (27)?

No, escape sequences can be of arbitrary length.

The first thing to try is:

del os.environ['TERM']

Any correctly-written program uses the value of the TERM environment
variable to select escape codes which are appropriate for the terminal
being used.

Unfortunately, there are many incorrectly written programs which assume
that all terminals support certain escape sequences.

The fact that the program is using escape sequences even when
stdout/stderr isn't a tty indicates that it isn't correctly written, so
it far from certain that clearing TERM will work.
 
M

m

If I add the line:
     for l in line: print ord(l),'\t',l
after the first readline, I get the following:
27          
91         [
48         0
48         0
109        m
27          
91         [
51         3
55         7
109        m
before the codes begin for the string as it appears if I just print
it.  So, what is this sequence?  They seem like some sort of escape
codes, I've never seen this before at all.

<ESC>[00m is the ANSI code to reset attributes to their default state.
Can anyone enlighten me as to what is going on?
And, can I safely strip sets of 5 characters from the front as long as
they start with Escape (27)?

No, escape sequences can be of arbitrary length.

It turned out that make was aliased to colourmake, and the escape
codes were being
put in there for beautifying the console output. Sorry to bother
everyone.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,479
Members
44,900
Latest member
Nell636132

Latest Threads

Top