Управление stdout / stderr из Jython - PullRequest
7 голосов
/ 19 февраля 2011

Я вызываю функцию из библиотеки java из jython, которая печатает на стандартный вывод.Я хотел бы подавить этот вывод из скрипта jython.Я пытаюсь использовать идиому python, заменяя sys.stdout файлом, подобным объекту (StringIO), но это не фиксирует вывод библиотеки java.Я предполагаю, что sys.stdout не влияет на программу Java.Существует ли стандартное соглашение для перенаправления или подавления этого вывода программно в jython?Если нет, то каким образом я могу это сделать?

Ответы [ 2 ]

9 голосов
/ 19 февраля 2011

Вы можете использовать System.setOut, например:

>>> from java.lang import System 
>>> from java.io import PrintStream, OutputStream
>>> oldOut = System.out
>>> class NoOutputStream(OutputStream):         
...     def write(self, b, off, len): pass      
... 
>>> System.setOut(PrintStream(NoOutputStream()))
>>> System.out.println('foo')                   
>>> System.setOut(oldOut)
>>> System.out.println('foo')                   
foo

Обратите внимание, что это не повлияет на вывод Python, потому что Jython захватывает System.out при запуске, чтобы вы могли переназначить sys.stdout так, как вы ожидаете.

1 голос
/ 29 сентября 2015

Я создал менеджер контекста для имитации (Python3) файла contextlib redirect_stdout (здесь) :

'''Wouldn't it be nice if sys.stdout knew how to redirect the JVM's stdout? Shooting star.
        Author: Sean Summers <seansummers@gmail.com> 2015-09-28 v0.1
        Permalink: https://gist.githubusercontent.com/seansummers/bbfe021e83935b3db01d/raw/redirect_java_stdout.py
'''

from java import io, lang

from contextlib import contextmanager

@contextmanager
def redirect_stdout(new_target):
        ''' Context manager for temporarily redirecting sys.stdout to another file or file-like object
                see contextlib.redirect_stdout documentation for usage
        '''

        # file objects aren't java.io.File objects...
        if isinstance(new_target, file):
                new_target.close()
                new_target = io.PrintStream(new_target.name)
        old_target, target = lang.System.out, new_target
        try:
                lang.System.setOut(target)
                yield None
        finally:
                lang.System.setOut(old_target)
...