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

David Hutto dwightdhutto at gmail.com
Wed Oct 24 02:02:08 EDT 2012


On Tue, Oct 23, 2012 at 11:41 PM, Evan Driscoll <edriscoll at wisc.edu> wrote:
> OK, one more self-reply. :-)
>
> I found http://bugs.python.org/issue5380 which seems to be relevant. Sounds
> like the OS is returning an error, and that's naturally being propagated
> through Python. And further testing reveals the problem only surfaces when
> the child actually exits -- if the child writes data to the pipe and is more
> enthusiastic about living, then the parent can read it successfully. While
> it'd be nice if my example worked, for my actual purpose I think that's good
> enough (I just won't be able to test *quite* as easily for a while).
>
> I am still curious if anyone know why it worked in 2 though.
>
> Evan
>
>
>
>
> On 10/23/2012 10:03 PM, Evan Driscoll wrote:
>>
>> 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

at first glance, you have the file open for writing('w'), not
reading('r'), but may not be that.

I'll check if I get a few minutes.



-- 
Best Regards,
David Hutto
CEO: http://www.hitwebdevelopment.com



More information about the Python-list mailing list