Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

331
Vistas
Why do Inline::Python functions that print fail to be redirected?

Here is the simplest reproducible for my problem:

#!/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_CODE

When run simply:

$ perl small.pl
In the python test print
Got back 32

But when redirected:

$ perl small.pl | tee foo
Got back 32
$ cat foo
Got back 32

What could I be doing wrong such that Inline::Pythoncode fails to print to a redirected output?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Py_Finalize() isn't called to properly destruct the Python interpreter.

Thankfully, the module exposes this function as py_finalize, allowing us to call it ourselves. Add the following to your program:

END { Inline::Python::py_finalize(); }

Demo:

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 32
over 4 years ago · Santiago Trujillo Denunciar

0

The complete thing to do is:

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();
}

You must also unbuffer Perl's output. Thanks to ikegami who commented to that effect in a now-deleted post, and reminded me about py_finalize().

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda