Ignore printout

Discussion in 'Ruby' started by Fredrik, Oct 12, 2007.

  1. Fredrik

    Fredrik Guest

    I am using a compiled C-code in my Ruby program. The problem is that
    the C-code prints some messages that I don't want to show in my Ruby
    program. What would be the best way to get rid of these printouts?

    I don't want to get into the original C-code and take away the print
    commands since that is not my code. Are the printouts sent directly to
    standard output, meaning there is no way for Ruby to interfere?

    Thanks for any help!

    /Fredrik
     
    Fredrik, Oct 12, 2007
    #1
    1. Advertising

  2. Fredrik

    mortee Guest

    Fredrik wrote:
    > I am using a compiled C-code in my Ruby program. The problem is that
    > the C-code prints some messages that I don't want to show in my Ruby
    > program. What would be the best way to get rid of these printouts?
    >
    > I don't want to get into the original C-code and take away the print
    > commands since that is not my code. Are the printouts sent directly to
    > standard output, meaning there is no way for Ruby to interfere?


    You may try to redirect $stdout while the C code runs - I'm not sure
    this will work, but it's worth a try.

    mortee
     
    mortee, Oct 12, 2007
    #2
    1. Advertising

  3. Fredrik

    Eric Hodel Guest

    On Oct 11, 2007, at 19:40 , Fredrik wrote:

    > I am using a compiled C-code in my Ruby program. The problem is that
    > the C-code prints some messages that I don't want to show in my Ruby
    > program. What would be the best way to get rid of these printouts?
    >
    > I don't want to get into the original C-code and take away the print
    > commands since that is not my code. Are the printouts sent directly to
    > standard output, meaning there is no way for Ruby to interfere?


    You will need to reopen STDOUT to /dev/null

    --
    Poor workers blame their tools. Good workers build better tools. The
    best workers get their tools to do the work for them. -- Syndicate Wars
     
    Eric Hodel, Oct 12, 2007
    #3
  4. Fredrik

    Fredrik Guest

    >
    > You will need to reopen STDOUT to /dev/null
    >


    Then I have two more questions to that :)

    1) What's the difference between $stdout and STDOUT? They seem to be
    the same thing.

    2) In my pickaxe book I read that "Assignment to $stdout is
    depracated; use $stdout.reopen instead." But if I want to redirect
    $stdout and then $direct it back to what it was before, surely I HAVE
    to use assignment to $stdout. Like this:

    out = $stdout
    $stdout = File.new('/dev/null','w')
    puts 'This is not to be seen by anybody.'
    $stdout.reopen(out)

    If I use reopen on the second line instead, the 'out' variable comes
    along to this new value and nobody knows where the "usual stdout" is,
    right?
     
    Fredrik, Oct 12, 2007
    #4
  5. Fredrik

    Fredrik Guest

    I should clarify myself:
    I was expecting to find that STDOUT is a constant so that I could do:

    $stdout.reopen(File.new('/dev/null','w'))
    puts 'Nobody can see this.'
    $stdout.reopen(STDOUT)

    But after the first line, my STDOUT is pointing to the exact same
    place as $stdout. Isn't that weird?
     
    Fredrik, Oct 12, 2007
    #5
  6. Fredrik

    Fredrik Guest

    Well, this does the trick (note the 'clone' instruction on line 1). It
    seems to be working nicely also for the compiled binary that I am
    calling.

    out = $stdout.clone
    $stdout.reopen(File.new('/dev/null','w'))
    puts 'You cant see this!'
    $stdout.reopen(out)

    I am still confused over why STDOUT is not a constant though...
    Thanks for your pointers!
     
    Fredrik, Oct 12, 2007
    #6
  7. Fredrik

    mortee Guest

    Fredrik wrote:
    > I am still confused over why STDOUT is not a constant though...
    > Thanks for your pointers!


    I'd guess that when you reopen a stream, then it as an object remains
    the same, just what you send it will end up somewhere else than before.
    In contrast, when you assign to a variable, the object itself changes
    which that variable references.

    Since $stdout and STDOUT initially point to the same object, if you dont
    assign $stdout, instead you modify the onject itself, the two continue
    to reference the same original object. Remember that you can modify a
    constant object's state without any warning anyway, so you could even
    reopen STDOUT itself.

    mortee
     
    mortee, Oct 12, 2007
    #7
  8. Fredrik wrote:
    > out = $stdout
    > $stdout = File.new('/dev/null','w')
    > puts 'This is not to be seen by anybody.'
    > $stdout.reopen(out)


    Only as an remark - on Windows you should use

    $stdout = File.open("nul:", "w")

    to ignore Output, and

    $stdout = STDOUT

    to reset.

    Wolfgang Nádasi-Donner
    --
    Posted via http://www.ruby-forum.com/.
     
    Wolfgang Nádasi-Donner, Oct 12, 2007
    #8
  9. Fredrik

    Eric Hodel Guest

    On Oct 11, 2007, at 22:45 , Fredrik wrote:
    >> You will need to reopen STDOUT to /dev/null

    >
    > Then I have two more questions to that :)
    >
    > 1) What's the difference between $stdout and STDOUT? They seem to be
    > the same thing.


    http://blog.segment7.net/articles/2006/08/17/stdout-vs-stdout

    In your case you want to reopen STDOUT because somebody using your
    code may have changed $stdout, if they want to capture or redirect
    output.

    > 2) In my pickaxe book I read that "Assignment to $stdout is
    > depracated; use $stdout.reopen instead." But if I want to redirect
    > $stdout and then $direct it back to what it was before, surely I HAVE
    > to use assignment to $stdout. Like this:


    I don't think this is true anymore. You can't reopen using StringIO
    to capture regular ruby puts or p.

    > out = $stdout
    > $stdout = File.new('/dev/null','w')
    > puts 'This is not to be seen by anybody.'
    > $stdout.reopen(out)
    >
    > If I use reopen on the second line instead, the 'out' variable comes
    > along to this new value and nobody knows where the "usual stdout" is,
    > right?


    Right, you should dup $stdout there.

    --
    Poor workers blame their tools. Good workers build better tools. The
    best workers get their tools to do the work for them. -- Syndicate Wars
     
    Eric Hodel, Oct 12, 2007
    #9
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. TJS
    Replies:
    0
    Views:
    303
  2. Mike Grace

    Can I output a printout as a tif?

    Mike Grace, Aug 27, 2003, in forum: Java
    Replies:
    1
    Views:
    370
    Mike Grace
    Aug 27, 2003
  3. Bill Dennis

    Imbedding Word Files in Printout

    Bill Dennis, Dec 5, 2003, in forum: Java
    Replies:
    0
    Views:
    328
    Bill Dennis
    Dec 5, 2003
  4. Replies:
    3
    Views:
    545
    John C. Bollinger
    Mar 8, 2006
  5. Rob Meade
    Replies:
    6
    Views:
    292
    Rob Meade
    Mar 1, 2004
Loading...

Share This Page