【发布时间】:2021-04-21 09:51:50
【问题描述】:
use Test::Trap;
use Data::Dumper;
use Inline Python => <<END;
import logging
from os import sys
_logger = logging.getLogger()
_logger.setLevel(logging.INFO)
handler = logging.StreamHandler(sys.stderr)
_logger.addHandler(handler)
def fun():
print("From print")
logging.info("Inside fun")
END
trap { fun(); };
print Dumper($trap->stdout);
print Dumper($trap->stderr);
sub fun1 {
print "From fun1";
}
trap {fun1();};
print "Trap stdout from perl subroutine call\n";
print Dumper($trap->stdout);
print Dumper($trap->stderr);
输出:
From print
Inside fun
$VAR1 = '';
$VAR1 = '';
Trap stdout from perl subroutine call
$VAR1 = 'From fun1'
$VAR1 = '';
这个程序的输出是在屏幕上打印“From print”和“Inside fun”,但是$trap->stderr和$trap->stdout对于fun()打印为空白(从perl调用的python API)
但是对于在 Perl 代码中定义的fun1() 子例程,会打印出trap->stdout。
谁能建议如何使用 perl-python 接口的陷阱获取 stdout/stderr?
【问题讨论】:
-
你有没有试过看看内联python的输出是否真的进入了主程序的输出通道?它可以做各种各样的事情,比如创建一个子shell,使用不同的二进制文件来执行python代码。例如,仅仅因为您在屏幕上看到它并不意味着它会进入标准输出。