Perl调用Python时如何将数组作为参数传递给Python函数
解决方案
核心问题说明
你当前的写法存在两处核心问题:
- Perl侧直接传递数组到命令行时,Python侧需要通过标准库的
sys.argv接收所有命令行参数,而非直接注入自定义test函数的入参 - 现有Python脚本没有入口逻辑读取命令行参数,也没有主动调用
test函数,自然无法正确拿到数组
修正方案
1. Perl侧代码调整
优先使用多参数形式的system调用,会自动处理参数转义,避免带空格、特殊符号的参数被错误拆分:
my @stmts = ("cd /tmp", "touch test.txt"); # 多参数调用自动处理转义,不需要手动拼接字符串 system('python.exe test.py', @stmts);
如果必须用字符串拼接形式调用,可以用quotemeta处理每个参数避免解析错误:
my $cmd = 'python.exe test.py ' . join(' ', map { quotemeta } @stmts); system($cmd);
2. Python侧代码调整
sys.argv本身就是列表类型,第一个元素是当前脚本名,从第二个元素开始就是Perl传递过来的数组内容:
import sys def test(stmts): # 原写法字符串拼接存在语法错误,这里用f-string格式化输出 print(f"Statements: {stmts}") # 遍历数组元素示例 for index, stmt in enumerate(stmts): print(f"第{index+1}条语句:{stmt}") if __name__ == '__main__': # 去掉第一个元素(脚本名),剩下的就是传入的数组 stmts = sys.argv[1:] test(stmts)
运行效果
执行Perl脚本后,Python输出如下:
Statements: ['cd /tmp', 'touch test.txt'] 第1条语句:cd /tmp 第2条语句:touch test.txt
内容的提问来源于stack exchange,提问作者ssr
相关产品推荐
相关产品推荐

