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::Python
code fails to print to a redirected output?
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
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()
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With