FAQ
Hi!

I'm trying to add some scripting capabilities to an application. Since it is
a GUI application, I need some way to display output from Python. For 3.x,
where "print" is a function, I'd just exchange this function with one that
redirects the output to a log window, right.

However, I'm using 2.6 here, where that can't work. So, what I was thinking
was to redirect "sys.stdout" and "sys.stderr" to a log window and possibly
replace "sys.stdin" with something that causes meaningful errors if some
code tries to use it, but that last point is just icing on the cake.

What seems cumbersome is that I'll need to write something that supports the
file interface using C, which is still a bit awkward. I'm wondering, isn't
there an easier way to achieve this? How would you do it?


Thank you!

Uli

--
Domino Laser GmbH
Gesch?ftsf?hrer: Thorsten F?cking, Amtsgericht Hamburg HR B62 932

Search Discussions

  • Thomas Jollans at Jul 5, 2011 at 2:18 pm

    On 07/05/2011 02:50 PM, Ulrich Eckhardt wrote:
    I'm trying to add some scripting capabilities to an application. Since it is
    a GUI application, I need some way to display output from Python. For 3.x,
    where "print" is a function, I'd just exchange this function with one that
    redirects the output to a log window, right.

    However, I'm using 2.6 here, where that can't work. So, what I was thinking
    was to redirect "sys.stdout" and "sys.stderr" to a log window and possibly
    replace "sys.stdin" with something that causes meaningful errors if some
    code tries to use it, but that last point is just icing on the cake.

    What seems cumbersome is that I'll need to write something that supports the
    file interface using C, which is still a bit awkward. I'm wondering, isn't
    there an easier way to achieve this? How would you do it?
    You can mess with low-level file descriptors. Example:

    # create new stdout:
    fout = file('out.txt', 'w')

    # close stdout (fd 1)
    import os
    os.close(1)

    # use fout as new stdout
    os.dup2(fout.fileno(), 1)

    # test. This will end up in out.txt
    print "Testing."

    # do the same for stdin (0) and stderr (2)

    # - EOF -

    However, I suggest you consider isolating your scripts from you main
    program and run them in a separate interpreter. You can provide dummy
    modules that communicate with your application via sockets to the
    scripts. Setting the standard files in the child process is easy: the
    Popen constructor takes stdin/stdout/stderr arguments.

    -T
  • Steven D'Aprano at Jul 5, 2011 at 2:36 pm

    Ulrich Eckhardt wrote:

    Hi!

    I'm trying to add some scripting capabilities to an application. Since it
    is a GUI application, I need some way to display output from Python. For
    3.x, where "print" is a function, I'd just exchange this function with one
    that redirects the output to a log window, right.

    However, I'm using 2.6 here, where that can't work. So, what I was
    thinking was to redirect "sys.stdout" and "sys.stderr" to a log window and
    possibly replace "sys.stdin" with something that causes meaningful errors
    if some code tries to use it, but that last point is just icing on the
    cake.

    What seems cumbersome is that I'll need to write something that supports
    the file interface using C, which is still a bit awkward. I'm wondering,
    isn't there an easier way to achieve this? How would you do it?
    Why do you think it needs to be in C? As far as I can tell, so long as it
    quacks like a file object (that is, has a write method), it should work.

    import StringIO, sys
    class Test:
    ... def __init__(self):
    ... self.out = sys.stdout
    ... self.log = StringIO.StringIO()
    ... def write(self, text):
    ... self.log.write(text.upper())
    ... self.out.write(''.join(reversed(text)))
    ...
    fake_out = Test()
    sys.stdout = fake_out
    print "Hello world"
    dlrow olleH
    print "Goodbye cruel world!!!"
    !!!dlrow leurc eybdooG
    sys.stdout = sys.__stdout__
    fake_out.log.getvalue()
    'HELLO WORLD\nGOODBYE CRUEL WORLD!!!\n'



    --
    Steven
  • Chris Angelico at Jul 5, 2011 at 3:20 pm

    On Wed, Jul 6, 2011 at 12:36 AM, Steven D'Aprano wrote:
    print "Hello world"
    dlrow olleH
    You, sir, have a warped and twisted mind.

    And I love it!!

    Now to secretly put code into some module somewhere and wait for
    people to start tearing their hair out.... wait, did I say that out
    loud?

    ChrisA
  • Andrew Berg at Jul 5, 2011 at 9:04 pm

    On 2011.07.05 10:20 AM, Chris Angelico wrote:
    You, sir, have a warped and twisted mind.

    And I love it!!

    Now to secretly put code into some module somewhere and wait for
    people to start tearing their hair out.... wait, did I say that out
    loud?
    from pytroll import print
  • Ulrich Eckhardt at Jul 6, 2011 at 6:24 am

    Steven D'Aprano wrote:
    Why do you think it [sink for use as sys.stdout] needs to be in C? As
    far as I can tell, so long as it quacks like a file object (that is,
    has a write method), it should work.
    Good point & thanks for the example fish!

    Uli


    --
    Domino Laser GmbH
    Gesch?ftsf?hrer: Thorsten F?cking, Amtsgericht Hamburg HR B62 932

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouppython-list @
categoriespython
postedJul 5, '11 at 12:50p
activeJul 6, '11 at 6:24a
posts6
users5
websitepython.org

People

Translate

site design / logo © 2022 Grokbase