我正在尝试使用python 2.7做一个Mac版本的程序,该程序在Windows下可以正常运行。在Mac(在VirtualBox中运行的OS X El Capitan)下,由于无法正确识别我传递给Shell的参数,因此失败。
原始代码:
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]
我在这里想念什么?
您正在要求操作系统运行可执行文件'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
命令的所有stdout输出都将重定向到文件。
如果您想mhl
直接在Python中捕获命令的输出,则在这里我不使用Shell中介程序。运行时不shell=True
使用,然后仅用于subprocess.check_output()
检索输出:
output = sub.check_output(['mhl', 'verify', '-vv', '-f', item])
请注意,现在必须将程序名称和参数以立即拆分的方式传递到单独的字符串中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句