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

kmarkkk 2012-10-19 09:03:28
现在想实现一个功能就是从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?

先谢过了
...全文
1171 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
M陌小威 2013-06-06
  • 打赏
  • 举报
回复
  %h = ();
  $h{'a'} = "a";
  system("python p.py -n %h");
kmarkkk 2013-01-07
  • 打赏
  • 举报
回复
谢谢你。我都已经忘了。。。。我试了下发现不行 可能内部hashtable的实现方法不同吧 直接把参数一个一个传递过去了
zjs100901 2012-12-08
  • 打赏
  • 举报
回复
楼主,这么久了,你是怎么解决的? 你的 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
zjs100901 2012-10-19
  • 打赏
  • 举报
回复
  %h = ();
$h{'a'} = "a";
system("python p.py -n %h");

system中,改成%看看。
kmarkkk 2012-10-19
  • 打赏
  • 举报
回复
我试过的. 不行. 会直接把 "%h" 这个字符传给python了

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧