Llamo a una función en una biblioteca java desde jython que imprime a stdout. Me gustaría suprimir esta salida del script jython. Intento que el modismo python reemplace sys.stdout con un archivo como objeto (StringIO), pero esto no captura la salida de la biblioteca java. Supongo que sys.stdout no afecta el programa java. ¿Existe una convención estándar para redirigir o suprimir esta salida programáticamente en jython? Si no, ¿de qué manera puedo lograr esto?Controlando stdout/stderr desde Jython
7
A
Respuesta
9
Puede utilizar System.setOut
, así:
>>> 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
Tenga en cuenta que esto no afectará a la salida de Python, porque Jython agarra System.out
cuando se pone en marcha para que pueda reasignar sys.stdout
como era de esperar.
1
He creado un gestor de contexto para imitar redirect_stdout de contextlib (de python3) (gist here):
'''Wouldn't it be nice if sys.stdout knew how to redirect the JVM's stdout? Shooting star.
Author: Sean Summers <[email protected]> 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)
Cuestiones relacionadas
- 1. ¿Es posible usar SWT desde Jython?
- 2. Invocar Jython desde Python (o viceversa)
- 3. Controlando rsync con Python?
- 4. jython syntaxerror?
- 5. jython multithreading
- 6. ¿Cómo se ejecutan guiones jython multiproceso desde Java?
- 7. Controlando la verbosidad de make
- 8. controlando la salida con RApacheOutputErrors
- 9. Interoperabilidad de Scala y Jython
- 10. Renombrar archivos, Python/Jython
- 11. Aleatoriedad en Jython
- 12. ¿Usando Jython con Django?
- 13. Crear byte [] en Jython
- 14. Instalación de Jython en Ubuntu
- 15. Uso de ctypes con jython
- 16. fast-ish python/jython IPC?
- 17. Controlando las Afirmaciones de Java - Mejores Prácticas
- 18. Controlando la visibilidad de los valores enum
- 19. Controlando el volumen en una aplicación Java
- 20. Controlando Python PLY estados lexer del analizador
- 21. Controlando iTunes con ASP.NET ejecutándose bajo IIS
- 22. Uso de Jython con M2Eclipse
- 23. ejecutando bytecode jython usando java
- 24. Python/jython coexistiendo en virtualenv
- 25. Jython CLASSPATH, sys.path y controladores JDBC
- 26. ¿Llamar a Python desde Java a través del motor de scripts (jython)?
- 27. Groovy ventajas sobre Jython o Jruby?
- 28. Aplicaciones de Jython en el mundo real
- 29. jython java.lang.NoClassDefFoundError: java.lang.NoClassDefFoundError: org/json/simple/JSONObject
- 30. ¿Hay problemas para desarrollar Django en Jython?