perl -从python返回值

8fq7wneg  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(158)

我正在运行一个运行python脚本的perl脚本。

# python code = run_me.py

def main():
    return 123;

if __name__ == '__main__':
    main()

和Perl代码:

# perl code
my $ret = // What should I write here?
print "ret = $ret" # should print "ret = 123"

system(“run_me.py”)--〉返回退出代码(在本例中为0)
'run_me.py'--〉返回标准输出(在本例中为空字符串)
我如何在不打开套接字或文件的情况下将123返回到Perl?这可能吗?

kb5ga3dv

kb5ga3dv1#

Python程序的编写不符合您的要求。您希望123从Python进程传递到其他进程。但是Python的return不执行进程间通信。(因此池上建议使用sys.exit(),它 * 是 * 一种进程间通信机制。)最好的解决方案是修复Python脚本:

# run_me.py
        if __name__ == '__main__':
            print(main())

然后,其他进程(如运行Perl的进程)可以从管道读取main函数的输出:

# perl
        my $result = qx{ run_me.py };

如果由于某种原因,你不可能修改Python程序,你仍然可以让它做你想做的事情,但这将是一个黑客,因为它必须解决原始Python程序的错误设计。在Perl中,尝试:

# perl
        my $result = qx{ python -c 'import run_me; print(run_me.main())' };

我更喜欢使用管道而不是exit,因为它更通用,更少受到模糊的限制。但如果你真的想使用exit,同样的方法可以从Python进程中过滤123:

# perl
        system "python -c 'import run_me; exit(run_me.main())' ";
        my $result = $? >> 8 ;
e37o9pze

e37o9pze2#

你的Python程序目前没有任何输出。[1]
您似乎正在尝试设定结束代码。若要设定结束代码,请使用sys.exit

import sys

def main():
    sys.exit(123)

if __name__ == '__main__':
    main()

import sys

def main():
    return 123

if __name__ == '__main__':
    sys.exit(main())

1.从技术上讲,可以说它向stdout输出一个空流,向stderr输出一个空流,退出代码为零,但它绝对不会以任何方式输出123。

相关问题