我正在尝试做一个简单的动作-从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)
有人有什么建议吗?谢谢!
答案 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语法的原因。