1

Suppress PSSE output entirely

Hello forum,

I have managed to find quite a few roundabout solutions to my problems with PSSE, but this one continues to annoy me.

I want to make it so that when using psspy, I do not get tons of text printed to the terminal. There was a time when I was able to circumvent this by using psspy.report_output to send the output to a text file, but that no longer appears to work.

According to the API manual, there is an option "6" for report_output that states "no output." That would be great if that option actually delivered what it promised, but I still get tons of text output to the command terminal. Is there an easy way to get rid of this?

EDIT:

I have tried chip's approach using contextmanager and setting sys.stdout to os.devnull, but to no avail. I even tried breaking up the use of the "with" statement into two methods like so:

OLD_STDOUT = sys.stdout    #Keep track of what the original output to terminal was
def silence(file_object = None):
    """
    Discard stdout (i.e. write to null device) or
    optionally write to given file-like object.
    """
    if file_object is None:
        file_object = open(os.devnull, 'w')

    try:
        sys.stdout = file_object
    except:
        sys.stdout = OLD_STDOUT
    return

def unsilence():
    """
    Reset stdout to the terminal like normal
    """
    sys.stdout = OLD_STDOUT
    return

And then I even tried something like:

print "Checkpoint 0"
silence()
psspy.psseinit(50000)
print "Checkpoint 1"
unsilence()

However, the text created from psseinit still gets to the terminal somehow. Oddly enough, checkpoint 1 does not get printed. I'm stumped.

JDRobers's avatar
58
JDRobers
asked 2015-03-05 09:14:36 -0500, updated 2015-03-06 07:38:06 -0500
edit flag offensive 0 remove flag close merge delete

Comments

My favorite way by far is to redirect with a contextmanger like this [example](https://psspy.org/psse-help-forum/question/93/silencing-psse-stdout/). Here is my [gist](https://gist.github.com/cwebber314/0b09f870f62f96ddc57a) I created as another example.

chip's avatar chip (2015-03-05 13:43:39 -0500) edit

I tried the contextmanager approach just now, creating the silence() function that you showed in your example, verbatim. Unfortunately, I am still getting the output to console, even for something as simple as containing psseinit inside a "with silence()" block.

JDRobers's avatar JDRobers (2015-03-06 07:17:59 -0500) edit
add a comment see more comments

2 Answers

4

I just thought I would add a bit to the answer. @chip provided a great suppression solution by redirecting PSS/e to python and then directing python to save stdout to a file. I have a very similar tatic in my code, and this workflow is great for being able to revisit all of the regurgitation that PSS/e does (especially for debugging purposes). However, since file I/O is one of the most costly things you can do (i.e open, write to, close a file), it may (depending on what you are doing) be useful and/or save time to actually suppress PSS/e output instead of just hiding it in a file.

One thing that I did not see covered here was how to do this, as well as a follow-up to @JDRobers's comment:

According to the API manual, there is an option "6" for report_output that states "no output." That would be great if that option actually delivered what it promised, but I still get tons of text output to the command terminal.

I think what is being missed here, is what you are actually doing in PSS/e because that governs what suppression API function you want to use. Basically what I am saying is that psspy.report_output() is not the only output API.

The four API's that you want to use at the beginning of your simulation are:

psspy.report_ouput(6,'',[])
psspy.progress_output(6,'',[])
psspy.alert_output(6,'',[])
psspy.prompt_output(6,'',[])

These will suppress all PSS/e output. Except I cannot figure out how to suppress the copyright and 3 lines of header for PSS/e initialization. so you still get the following on your command prompt:

PSS(R)E Version 33
 Copyright (c) 1976-2015
 Siemens Industry, Inc.,
 Power Technologies International                            (PTI)
 This program is a confidential  unpublished  work  created  and  first
 licensed in 1976.  It is a trade secret which is the property of  PTI.
 All use,  disclosure,  and/or reproduction not specifically authorized
 by  PTI  is prohibited.   This  program is protected  under  copyright
 laws  of  non-U.S.  countries  and  by  application  of  international
 treaties.  All  Rights  Reserved  Under  The  Copyright  Laws.


           SIEMENS POWER TECHNOLOGIES INTERNATIONAL

      15000 BUS POWER SYSTEM SIMULATOR--PSS(R)E-33.5.0

             INITIATED ON SAT, MAR 28 2015  15:15

Hope that helps someone out!

wassup_doc's avatar
110
wassup_doc
answered 2015-03-28 17:52:29 -0500
edit flag offensive 0 remove flag delete link

Comments

Using your advice and combining it with the silence() method for the initial copyright printout, I have acheived my goal. Thanks!

JDRobers's avatar JDRobers (2015-03-31 13:03:04 -0500) edit

This solution was really helpful, thanks!

QuinnP's avatar QuinnP (2023-01-23 00:50:43 -0500) edit
add a comment see more comments
2

I prefer to redirect STDOUT using a contextmanager so that I am sure that STDOUT goes back to normal after I am done capturing/ignoring it. The contextmanger will do the right thing if there is an exception, and plays nicely with pdb.set_trace(). If I don't use a contextmanger it still works, but invariably my code throws an exception while STDOUT is being captured, and then everything is a mess because I can't see STDOUT.

Usually if redirecting STDOUT is failing it is because I forget the line redirect.psse2py(). Here is a simple example with psseinit()

# silence.py
import sys
import os

import pssepath
pssepath.add_pssepath()    
import psspy

import redirect
redirect.psse2py()

import contextlib
@contextlib.contextmanager
def silence(new_target=None):
    # sometimes you don't care about messages.
    if new_target is None:
        new_target = open(os.devnull, 'w')
    old_target, sys.stdout = sys.stdout, new_target # replace sys.stdout
    try:
        yield new_target # run some code with the replaced stdout
    finally:
        sys.stdout = old_target # restore to the previous value

if sys.argv[1] == 'silent':
    with silence():
        psspy.psseinit(50000)
else:
    psspy.psseinit(50000)

And the results from running it in the CLI:

C:\projects\foo
>python silence.py silent

C:\projects\foo
>python silence.py verbose

 PSS(R)E Version 33
 <... snip ...>
 treaties.  All  Rights  Reserved  Under  The  Copyright  Laws.


           SIEMENS POWER TECHNOLOGIES INTERNATIONAL

      50000 BUS POWER SYSTEM SIMULATOR--PSS(R)E-33.5.2

             INITIATED ON FRI, MAR 06 2015   9:57

Without redirect.psse2py()

If you do not run the redirect.psse2py() function, STDOUT will be captured for everything except PSSE. (I do not understand how PSSE is making text appear on the screen without STDOUT).

If we use our example code above and leave out the redirect.psse2py(), we see that normal python is silenced:

In [1]: print "Checkpoint 0"
Checkpoint 0

In [2]: with silence():
   ...:     print "Checkpoint 1"
   ...:
In [3]:

But PSSE is still noisy:

In [3]: with silence():
   ...:     psspy.psseinit(10)
   ...:

 PSS(R)E Version 33
 Copyright (c) 1976-2015
 <.......... snip ..............>
chip's avatar
459
chip
answered 2015-03-06 10:12:55 -0500, updated 2015-03-06 10:28:58 -0500
edit flag offensive 0 remove flag delete link

Comments

Thank you! That redirect.psse2py() was the missing link.

JDRobers's avatar JDRobers (2015-03-06 11:41:32 -0500) edit
add a comment see more comments

Your Answer

Login/Signup to Answer