我正在尝试使用子进程模块运行以下命令:
/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')
我假设这是引用搞乱的报价。我对吗?我该如何解决这个问题?
答案 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中,每个字符串在第一个字符串之后是一个参数,因此您不需要做任何特殊的事情。