我正在尝试做一个简单的操作——从 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)
大家有什么建议吗?谢谢!
最佳答案
方法 3 看起来大致正确,但您几乎肯定不想“引用”URL,需要提供正确的脚本路径,并且希望将单个列表传递给 Popen
。尝试:
addcmd = ["/usr/bin/perl", "../perl/bin/engine.pl", "--uid", str(our_id), "--url", source_url]
addtodb = subprocess.Popen(addcmd)
更新:合并来自@AJefferiss的修复
对于如何处理程序参数,这里似乎存在一个潜在的误解。
命令 shell 通过解析用户输入来确定程序参数 - 通常按空格进行分割(除非用引号引起来)。相比之下,Popen
等底层 API 直接接受参数列表。
结果是,在使用此类 API 时,1) 您不需要引号,2) 您需要在参数周围删除额外的空格。这也是为什么您(通常)不能使用 shell 语法(如 ~
、通配符扩展或环境变量)的原因。
关于python - 无法使用 python 将参数传递给 perl 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53872246/