无法使用python将参数传递给perl脚本

时间:2018-12-20 16:09:29

标签: python python-3.x perl

我正在尝试做一个简单的动作-从python3脚本中执行一个perl脚本,并将几个参数传递给perl脚本。这是我尝试过的方法,没有任何效果:

方法1-运行perl脚本,但未传递参数

addexec = "../perl/bin/engine.pl"
addvars = " --uid " + str(our_id) + " --url '" + source_url + "'"
addtodb = subprocess.Popen(["/usr/bin/perl", addexec, addvars])

方法2-无法运行perl脚本,表示找不到文件

addexec = "../perl/bin/engine.pl --uid " + str(our_id) + " --url '" + source_url
addtodb = subprocess.Popen(["/usr/bin/perl", addexec])

方法3-perl脚本无法运行,会产生错误

addcmd = ["/usr/bin/perl", "../perl/bin/engine.pl", " --uid ", str(our_id), " --url '", source_url, "'"]
addtodb = subprocess.Popen(addcmd)

有人有什么建议吗?谢谢!

1 个答案:

答案 0 :(得分:5)

方法3看起来大致正确,但是您几乎可以肯定不想“引用” URL,需要提供正确的脚本路径,并希望将单个列表传递给Popen。试试:

addcmd = ["/usr/bin/perl", "../perl/bin/engine.pl", "--uid", str(our_id), "--url", source_url]
addtodb = subprocess.Popen(addcmd)

更新:来自@AJefferiss的修复程序

在这里,关于程序参数的处理方式似乎存在潜在的误解。

命令外壳通过解析用户输入来确定程序参数-通常在空格上分割(除非用引号引起来)。相反,诸如Popen之类的基础API直接接受参数列表。

结果是,使用此类API时1)不需要引号,而2)需要在参数周围添加多余的空格。这也是为什么您不能(通常)使用诸如~,通配符扩展或环境变量之类的shell语法的原因。