Reemplazando la entrada estándar con una cadena en python3 usando jupyter

Estoy tratando de reemplazar la entrada estándar por una cadena previamente definida.
Después de navegar en el desbordamiento de stack, encontré varias soluciones (aunque principalmente para python2).

La solución a continuación, por ejemplo, se probó en ideone.com y parece funcionar, sin embargo, cuando intenté agregarlo a mi código en mi computadora portátil jupyter, la redefinición de la entrada estándar se ignora.

¿Esto se debe a jupyter o algún problema en mi código, y cómo puedo solucionarlo?

import io,sys s = io.StringIO('Hello, world!') sys.stdin = s sys.__stdin__ = sr = input() print(r) 

La respuesta corta es que el portátil Jupyter no admite stdin / stdout, por lo que no puede confiar en ellos en el código del portátil.

La respuesta más larga es que stdin / stdout se implementan de forma diferente en Jupyter que en Python estándar, debido a los detalles de cómo Jupyter acepta la entrada / muestra la salida. Si desea algo que solicite la entrada del usuario si no hay una entrada disponible actualmente, esto funcionaría:

 import io,sys # if sys.stdin is empty, the user will be prompted for input # sys.stdin = io.StringIO('') sys.stdin = io.StringIO('Hello world') r = sys.stdin.readline() if not r: r = builtins.input() print(r) 

Referencia

stdin / stdout se habla un tanto elípticamente en los documentos Jupyter / IPython. Sin embargo, aquí hay una cita directa relevante de los documentos de %reset magic :

Al llamar a esta magia de los clientes que no implementan una entrada estándar, como la interfaz del portátil ipython, se restablecerá el espacio de nombres sin confirmación.