【问题标题】:Subprocess call with quoted arguments带引号参数的子进程调用
【发布时间】:2013-12-24 17:02:18
【问题描述】:

我正在尝试使用子进程模块运行以下命令:

/usr/local/MATLAB/R2013b/bin/matlab -r "func_call('output', '/path/to/location/')"

请注意,Matlab 要求函数调用使用双引号。上面的命令可以从 bash 命令行中找到。这是我在python中所做的

func = "func_call('output', '/path/to/loc/')"
cmd = "/usr/local/MATLAB/R2013b/bin/matlab "
options = "-r \"%s\"" % func
run_cmd = cmd + options
proc = subprocess.Popen(run_cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
proc.communicate()

我收到以下错误:

('', '/usr/local/MATLAB/R2013b/bin/matlab: eval: line 1738: syntax error near unexpected token `)\'\n/usr/local/MATLAB/R2013b/bin/matlab: eval: line 1738: `exec  "/usr/local/MATLAB/R2013b/bin/gla64/MATLAB"  -r ""\'"func_call(\'"\'output\'," \'/path/to/loc/\')"\'\n/usr/local/MATLAB/R2013b/bin/matlab: line 1738: warning: syntax errors in . or eval will cause future versions of the shell to abort as Posix requires\n')

我假设是引号弄乱了执行。我对吗?我该如何解决这个问题?

【问题讨论】:

  • 你试过import shlex; shlex.split(run_cmd)而不是普通的str.split()吗?但是,从一开始就将命令行创建为列表更容易。通过这种方式,您可以完全控制拆分。

标签: python subprocess


【解决方案1】:

我怀疑这是因为您拥有的split 会拆分所有空格,包括引号之间的空格。试试这个:

func = "func_call('output', '/path/to/loc/')"
cmd = "/usr/local/MATLAB/R2013b/bin/matlab"
run_cmd = [cmd, "-r", func]
proc = subprocess.Popen(run_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
proc.communicate()

请注意,我没有在 func 周围加上另一组引号。 shell 中的那些引号,即 bash,告诉 shell 它们之间的所有内容都是一个参数,这些引号被 shell 解析,而不是实际参数的一部分。在 python 中,每个字符串,在第一个是命令之后,都是一个参数,所以你不需要做任何特别的事情。

【讨论】:

  • proc.communicate() 可能会在您不使用的内存中创建巨大的字符串。您可以将其替换为out, err = proc.communicate() 以明确输出是累积的,或者使用subprocess.DEVNULL 模拟而不是subprocess.PIPE 来丢弃输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-03
  • 1970-01-01
  • 2018-07-30
  • 1970-01-01
  • 2013-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多