首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

怎样用perl脚本调用python脚本并传送参数

2013-01-11 
怎样用perl脚本调用python脚本并传递参数?本帖最后由 kmarkkk 于 2012-10-19 09:07:00 编辑现在想实现一个

怎样用perl脚本调用python脚本并传递参数?
本帖最后由 kmarkkk 于 2012-10-19 09:07:00 编辑 现在想实现一个功能就是从perl脚本向python脚本传递参数. 

一个叫 p.py 的python脚本 使用 argsparse, 比如接受一个 

parser = argparse.ArgumentParser()  //建立parser
parser.add_argument('-n', dest = number)  //接受n存入 number这个变量
args = parser.parse_args()  //得到所有参数
print(args.number)   //打印number这个变量



然后在perl里调用
$num = 5
system("python p.py -n $num");


通过命令行调用, 会成功输出5

但是我想传递一个hashtable给python脚本
%h = ()

然后把 $h 当作参数给python脚本去解析 怎么弄都不成功

希望高人指点一下. 应该怎么设置?  我定义了
parser.add_argument('-n', dest = number, type = dict) 也没用

  %h = ();
  $h{'a'} = "a";
  system("python p.py -n $h");



得到
Use of uninitialized value $h in concatenation (.) or string at ./test.pl line 13.

或者有没有别的方法传递hashtable?

先谢过了

[解决办法]
楼主,这么久了,你是怎么解决的?
你的 Python 代码,我这边不能通过编译,说 NameError: name 'number' is not defined,而且你那 C++ 风格的注释我这也不行。然后在今天,我试着在 Perl 这边把哈希转换成一个字符串,放到 system 里去调用,这个字符串的格式是 Python 那边的,即 {'a': 'a', 'b': 'bb'} 这种样子的。经过试验,成功了。但还有个问题,就是哈希的值只能是字符串,不能是数字,如果要支持数字作为哈希的值,在 Perl 这边还要改代码。
#!/usr/bin/perl -w
use strict;

my %hash = ( 'a'=>'a', 'b'=>'bb', 'c'=>'ccc' );
# 将哈希转换成 Python 那边的字符串表示{'a': 'a', 'b': 'bb', 'c': 'ccc'}
my $strDict = "{";# 开头的大括号
while( (my $key, my $value) = each %hash )
{
$strDict .= "'". $key . "': '" . $value . "',";# 每个元素,如"c': 'ccc',
}
$strDict = substr( $strDict, 0, length( $strDict )-1 );# 将最后一个逗号删掉(不删的话,Python 那边也不会有问题,但还是删掉吧)
$strDict .= "}";# 结尾的大括号
print "$strDict\n";

# 将命令连接起来,记得在哈希字符串两边用双引号包起来
my $cmd = 'python p.py -n "' . $strDict . '"';
system( $cmd );
#!/usr/bin/env python
# -*- coding:utf-8 -*- 

import argparse

parser = argparse.ArgumentParser() # 建立parser
parser.add_argument( 'dict', metavar = 'dict_str', type = str,
help = "一个字符串,表示 Python 里的字典。例如 {'a': 'a', 'b': 'bb'} 这种样子,中间的空格可省略。"
"如果没省略空格,记得在命令行里把整个字符串用双引号包起来哦。" )
parser.add_argument( '-n', dest = 'accumulate', action = 'store_const',
                   const = print, default = print,
                   help = "将一个 Python 风格的字典字符串转换成字典" )

args = parser.parse_args()# 执行此行之后,在 args.dict 里面就有所需的字符串了


print( args.dict )# 打印字典的字符串表示形式(调试用,可删除)
dict1 = dict( eval( args.dict ) )# 转换成真的字典
print( dict1 )# 看看是不是变成真的字典了
for item in dict1 :
print( item, "->", dict1[item] )

{'c': 'ccc','a': 'a','b': 'bb'}
{'c': 'ccc','a': 'a','b': 'bb'}
{'a': 'a', 'b': 'bb', 'c': 'ccc'}
a -> a
b -> bb
c -> ccc

热点排行