Aquí está el reproducible más simple para mi problema:
#!/usr/bin/env perl use 5.16.3; say "Got back ", test_print(); use Inline Python => <<'END_OF_PYTHON_CODE'; def test_print() -> int: print("In the python test print") return 32 END_OF_PYTHON_CODECuando se ejecuta simplemente:
$ perl small.pl In the python test print Got back 32Pero cuando se redirige:
$ perl small.pl | tee foo Got back 32 $ cat foo Got back 32 ¿Qué podría estar haciendo mal para que el código Inline::Python no se imprima en una salida redirigida?
Py_Finalize() no se llama para destruir correctamente el intérprete de Python.
Afortunadamente, el módulo expone esta función como py_finalize , permitiéndonos llamarla nosotros mismos. Agregue lo siguiente a su programa:
END { Inline::Python::py_finalize(); }Manifestación:
use feature qw( say ); use Inline Python => <<'END_OF_PYTHON_CODE'; def test_print() -> int: print("In the python test print") return 32 END_OF_PYTHON_CODE END { Inline::Python::py_finalize() if $ARGV[0]; } say "Got back ", test_print(); $ perl a.pl 0 In the python test print Got back 32 $ perl a.pl 0 | cat Got back 32 $ perl a.pl 1 In the python test print Got back 32 $ perl a.pl 1 | cat In the python test print Got back 32Lo completo que hay que hacer es:
BEGIN { # Unbuffer Python's output $ENV{PYTHONUNBUFFERED}=1; # Unbuffer Perl's output select((select(STDOUT), $|=1)[0]); select((select(STDERR), $|=1)[0]); } ... END { # Shut down the Python interpreter. Inline::Python::py_finalize(); } También debe quitar el búfer de la salida de Perl. Gracias a ikegami que comentó en ese sentido en una publicación ahora eliminada y me recordó sobre py_finalize() .