使用带引号的参数调用子进程

时间:2013-12-24 17:02:19

标签: python subprocess

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

/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')

我假设这是引用搞乱的报价。我对吗?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

我怀疑这是因为你有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中,每个字符串在第一个字符串之后是一个参数,因此您不需要做任何特殊的事情。