Re: The pty module, reading from a pty, and Python 2/3
On Tue, Oct 23, 2012 at 11:41 PM, Evan Driscoll edrisc...@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 -- http://mail.python.org/mailman/listinfo/python-list
Re: The pty module, reading from a pty, and Python 2/3
import sys import pty import os def get_text(filename): #you need to find the file size, and place it as an integer in read below, where you return the value statinfo = os.stat(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) #you have to input into read, how many characters you want read in. if you place a random integer in, it will read to that integer within the file return child_pty.read(statinfo.st_size) if __name__ == __main__: print(get_text(my-pty-test.py)) -- Best Regards, David Hutto CEO: http://www.hitwebdevelopment.com -- http://mail.python.org/mailman/listinfo/python-list
Re: The pty module, reading from a pty, and Python 2/3
#better coded for you to understand 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) #you need to find the file size, and place it as an integer in read below, where you return the value #you have to input into read, how many characters you want read in with statinfo.st_size statinfo = os.stat(filename) return child_pty.read(statinfo.st_size) if __name__ == __main__: print(get_text(my-pty-test.py)) -- Best Regards, David Hutto CEO: http://www.hitwebdevelopment.com -- http://mail.python.org/mailman/listinfo/python-list
Re: The pty module, reading from a pty, and Python 2/3
in other words, the last two lines of your function should be: statinfo = os.stat(filename) return child_pty.read(statinfo.st_size) -- Best Regards, David Hutto CEO: http://www.hitwebdevelopment.com -- http://mail.python.org/mailman/listinfo/python-list
Re: The pty module, reading from a pty, and Python 2/3
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 -- http://mail.python.org/mailman/listinfo/python-list
The pty module, reading from a pty, and Python 2/3
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 -- http://mail.python.org/mailman/listinfo/python-list
Re: The pty module, reading from a pty, and Python 2/3
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 -- http://mail.python.org/mailman/listinfo/python-list