在将命令传递给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
答案 0 :(得分:1)
使用.split()
字符串输入将会妨碍您,因为split()
不会尊重您的报价。
而是尝试Popen(['sh', '-c', 'sudo ls'])
请注意,双引号不存在。这是因为整个字符串sudo ls
(包括空格)以这种方式放入一个argv
条目中。