2016-11-05 38 views
0

我试图做一个Mac版本的程序,在Windows下运行良好,使用Python 2.7。在Mac(在VirtualBox中运行的OS X El Capitan)下,它失败了,因为我传递给shell的参数无法正确识别。Python 2 subprocess参数错误在Mac

原始代码:

for item in source_files: 

    # core process 
    output = sub.Popen(["mhl", "verify", "-vv", "-f", item, ">", text_report], 
         shell=True, 
         stdout=sub.PIPE, 
         stderr=sub.PIPE) 
    stdout_value, stderr_value = output.communicate() 

在Mac只有 'MHL' 的说法是公认的,所以我尝试这样做:

sub.Popen(['mhl verify -vv -f', item, '>', text_report] 

现在命令工作,但该项目(一.mhl文件)不承认,所以我尝试这样做:

sub.Popen(['mhl verify -vv -f', '/Users/simon/Documents/Documents.mhl', '>', text_report] 

这:

sub.Popen(['mhl verify -vv -f', r'/Users/simon/Documents/Documents.mhl', '>', text_report] 

同样的结果,它告诉我一个mhl文件应该遵循'-f'参数。如果我直接将项目添加到第一个参数,它工作正常:

sub.Popen(['mhl verify -vv -f /Users/simon/Documents/Documents.mhl', '>', text_report] 

我在这里错过了什么?

回答

1

您要求操作系统运行可执行文件'mhl verify -vv -f',并且没有这样的可执行文件。没有外壳拆分发生在那里的空间。

随着shell=True你想要的一切传为一个字符串,而不是作为单独的参数:

sub.Popen('mhl verify -vv -f {} > {}'.format(item, text_report), 
      shell=True, stdout=sub.PIPE, stderr=sub.PIPE) 

注意,有在指导stdout到管道在这里,小点,因为所有的标准输出输出从mhl命令被重定向到一个文件。

如果您想直接在Python中捕获mhl命令的输出,我不会在这里使用shell中介;运行无shell=True,然后只用subprocess.check_output()检索输出:

output = sub.check_output(['mhl', 'verify', '-vv', '-f', item]) 

注意,现在的程序名和参数必须在准备分裂传递到单独的字符串。

+0

感谢您的回答,但它不起作用,与原始代码一样,只有'mhl'参数被识别,它告诉我'参数的数量无效'。实际上'mhl verify -vv -f'被正确识别为使用'verify -vv -f'参数调用mhl可执行文件,但它告诉我一个mhl文件应该遵循'-f'参数。 –

+0

@SimonTheChain:你也传入'item','>'和'text_report'。 –

+0

@SimonTheChain:更新;我错过了你有'shell = True'设置。你仍然有一个命令'mhl verify -vv -f item'在这里执行。 –