我会尝试类似的东西:
#!/usr/bin/python
from __future__ import print_function
import shlex
from subprocess import Popen, PIPE
def shlep(cmd):
'''shlex split and popen
'''
parsed_cmd = shlex.split(cmd)
## if parsed_cmd[0] not in approved_commands:
## raise ValueError, "Bad User! No output for you!"
proc = Popen(parsed_command, stdout=PIPE, stderr=PIPE)
out, err = proc.communicate()
return (proc.returncode, out, err)
... 换句话说,让 shlex.split() 完成大部分工作。我不会尝试解析 shell 的命令行、查找管道运算符并设置您自己的管道。如果你打算这样做,那么你基本上必须编写一个完整的 shell 语法解析器,你最终会做大量的管道工作。
当然这提出了一个问题,为什么不使用带有shell=True(关键字)选项的Popen呢?这将允许您将一个字符串(不拆分也不解析)传递给 shell,并且仍然可以收集结果以按照您的意愿进行处理。我的示例不会处理命令中可能存在的任何管道、反引号、文件描述符重定向等,它们都将作为命令的文字参数出现。因此,它仍然比使用shell=True运行更安全......我给出了一个愚蠢的例子,根据某种“批准的命令”字典或集合检查命令——通过将其规范化为一个更有意义的绝对路径,除非您打算要求在将命令字符串传递给此函数之前对参数进行规范化。