在子进程命令中没有 shell=True 时无法执行 运行 命令
Unable to run command without shell=True in subprocess command
我正在 Linux 中使用 python 开发一个小工具。早些时候我使用的是 Python 2.7,但现在我将其更改为 Python 3.4,以查看它是否可以帮助解决我的问题。当我给出以下代码时:
try:
x=subprocess.check_output(command, shell=True, timeout=3)
except subprocess.TimeoutExpired as exc:
print ("Timeout bro")
exit()
except Exception as e:
msg = "Some issues in fetching details"
print (msg)
由于该命令从另一台设备获取详细信息并且该设备未正常运行,它在 3 秒后超时并打印消息 "Timeout bro"。我阅读了使用 shell=True 的安全问题,因此我将其设为 shell=False 一次,第二次我删除了该参数。
try:
x=subprocess.check_output(command, shell=False, timeout=3)
except subprocess.TimeoutExpired as exc:
print ("Timeout bro")
exit()
except Exception as e:
msg = "Some issues in fetching details"
print (msg)
我在多个地方读到该命令与 shell=False 一起使用同样有效。但是一旦我 运行 上面的代码与 shell=False
代码直接打印 "Some issues in fetching details" 而无需等待 3 秒。有什么方法可以 运行 没有 shell=True 的代码吗?请帮忙。谢谢!
尝试用 command.split()
拆分命令。字符串在 shell=True
的情况下有效,但对于 shell=False
它需要一个参数列表。但是,请注意拆分在某些情况下不起作用,例如路径中有 space 等。我建议在这种情况下使用 shlex
。
当使用shell=True
时,command
可能是一个字符串。当使用 shell=False
时,command
应该是一个字符串列表,第一个字符串是可执行文件,随后的字符串是要传递给可执行文件的参数。
您可以尝试将命令拆分为 shlex.split
:
import shlex
x = subprocess.check_output(shlex.split(command), shell=False, timeout=3)
默认情况下,当 posix=True
时,shlex.split
会删除反斜杠。因此,如果 shlex.split
不适用于您的 command
,您可能需要使用 posix=False
或手动拆分命令。
我正在 Linux 中使用 python 开发一个小工具。早些时候我使用的是 Python 2.7,但现在我将其更改为 Python 3.4,以查看它是否可以帮助解决我的问题。当我给出以下代码时:
try:
x=subprocess.check_output(command, shell=True, timeout=3)
except subprocess.TimeoutExpired as exc:
print ("Timeout bro")
exit()
except Exception as e:
msg = "Some issues in fetching details"
print (msg)
由于该命令从另一台设备获取详细信息并且该设备未正常运行,它在 3 秒后超时并打印消息 "Timeout bro"。我阅读了使用 shell=True 的安全问题,因此我将其设为 shell=False 一次,第二次我删除了该参数。
try:
x=subprocess.check_output(command, shell=False, timeout=3)
except subprocess.TimeoutExpired as exc:
print ("Timeout bro")
exit()
except Exception as e:
msg = "Some issues in fetching details"
print (msg)
我在多个地方读到该命令与 shell=False 一起使用同样有效。但是一旦我 运行 上面的代码与 shell=False
代码直接打印 "Some issues in fetching details" 而无需等待 3 秒。有什么方法可以 运行 没有 shell=True 的代码吗?请帮忙。谢谢!
尝试用 command.split()
拆分命令。字符串在 shell=True
的情况下有效,但对于 shell=False
它需要一个参数列表。但是,请注意拆分在某些情况下不起作用,例如路径中有 space 等。我建议在这种情况下使用 shlex
。
当使用shell=True
时,command
可能是一个字符串。当使用 shell=False
时,command
应该是一个字符串列表,第一个字符串是可执行文件,随后的字符串是要传递给可执行文件的参数。
您可以尝试将命令拆分为 shlex.split
:
import shlex
x = subprocess.check_output(shlex.split(command), shell=False, timeout=3)
默认情况下,当 posix=True
时,shlex.split
会删除反斜杠。因此,如果 shlex.split
不适用于您的 command
,您可能需要使用 posix=False
或手动拆分命令。