[Python-Dev] first correct explanation wins a beer...

Martin v. Loewis martin@loewis.home.cs.tu-berlin.de
Tue, 27 Feb 2001 07:52:27 +0100


> My guess: Unicode. Try casting to an 8-bit string and see what happens.

Paul is right, so I guess you owe him a beer...

To see this in more detail, compare

popen2.Popen3("/bin/ls").fromchild.readlines()

to

popen2.Popen3(u"/bin/ls").fromchild.readlines()

Specifically, it seems the problem is 

    def _run_child(self, cmd):
        if type(cmd) == type(''):
            cmd = ['/bin/sh', '-c', cmd]

in popen2. I still think there should be types.isstring function, and
then this fragment should read

    def _run_child(self, cmd):
        if types.isstring(cmd):
            cmd = ['/bin/sh', '-c', cmd]

Now, if somebody would put "funny characters" into cmd, it would still
give an error, which is then almost silently ignored, due to the 

        try:
            os.execvp(cmd[0], cmd)
        finally:
            os._exit(1)

fragment. Perhaps it would be better to put 

       if type(cmd) == types.UnicodeType:
          cmd = cmd.encode("ascii")

into Popen3.__init__, so you'd get an error if you pass those funny
characters.

Regards,
Martin