The pty module, reading from a pty, and Python 2/3

Evan Driscoll edriscoll at wisc.edu
Tue Oct 23 23:03:31 EDT 2012


Oh, and a little more information:

The log.txt file I create has the message that it's "about to execlp", 
and the exec() *does* actually happen -- the IOError is raised after the 
child process quits.

Evan



On 10/23/2012 09:59 PM, Evan Driscoll wrote:
> I have the following program. Everything is sunshine and rainbows when 
> I run in in Python 2, but when I run it under Python 3 I get an 
> IOError. 2to3 only reports one dumb suggestion re. a print call (which 
> I can get rid of by importing __future__'s print_function, and then it 
> just suggests removing that import).
>
> Can anyone shed any light? I am on Ubuntu Linux with Python 2.7.3 and 
> 3.2.3.
>
>
> (Just for the record, I figured out that it ran under Python 2 by 
> accident as I was reducing it for a "why doesn't this run?" email. :-) 
> I'm not super-familiar with Py3 as I've mostly only worked with 2.)
>
> I'm not 100% sure how this will come through, so I've also put it at 
> http://pastebin.com/60wjXSF3.
>
> Evan
>
>
> import sys
> import pty
> import os
>
> def get_text(filename):
>     try:
>         ( child_pid, fd ) = pty.fork()    # OK
>     except OSError as e:
>         print(str(e))
>         sys.exit(1)
>
>     if child_pid == 0:
>         try:
>             with open("log.txt", "w") as f:
>                 f.write("about to execlp")
>             os.execlp("cat", "cat", filename)
>         except:
>             with open("log.txt", "w") as f:
>                 f.write("could not spawn process")
>             print("Could not spawn")
>             sys.exit(1)
>
>     child_pty = os.fdopen(fd)
>     return child_pty.read()
>
>
> if __name__ == "__main__":
>     print(get_text("my-pty-test.py"))
>
>
> The read error I get is
>
> Traceback (most recent call last):
>   File "my-pty-test.py", line 28, in <module>
>     print(get_text("my-pty-test.py"))
>   File "my-pty-test.py", line 24, in get_text
>     return child_pty.read()
> IOError: [Errno 5] Input/output error
>




More information about the Python-list mailing list