如何将双引号传递给子进程而不将shell设置为true?

时间:2016-02-25 04:44:19

标签: python shell

在将命令传递给subprocess时我需要使用双引号,而不能使用shell=true。为清晰起见,以下是代码的简化版本:

def run_command(cmd):
    if isinstance(cmd, str):
        cmd = cmd.split()
    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
    output, error = proc.communicate()
    if proc.returncode != 0:
       raise subprocess.CalledProcessError(proc.returncode, cmd, error)

cmd = 'sh -c " sudo ls "'
run_command(cmd)

我尝试了以下但仍然失败了:

cmd = 'sh -c " sudo ls "'  #sudo: Syntax error: Unterminated quoted string
cmd = 'sh -c "sudo ls"'    #ls": Syntax error: Unterminated quoted string
cmd = 'sh -c sudo ls'      #usage: sudo -h | -K | -k | -V

1 个答案:

答案 0 :(得分:1)

使用.split()字符串输入将会妨碍您,因为split()不会尊重您的报价。

而是尝试Popen(['sh', '-c', 'sudo ls'])

请注意,双引号不存在。这是因为整个字符串sudo ls(包括空格)以这种方式放入一个argv条目中。