如果子程序命令中没有shell = True,则无法运行命令

Vip*_*pul -1 python subprocess python-3.x

我正在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)
Run Code Online (Sandbox Code Playgroud)

由于该命令从另一台设备获取详细信息,并且该设备无法正常运行,因此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)
Run Code Online (Sandbox Code Playgroud)

我在不同的地方都读到该命令在shell = False上同样有效。但是,只要我在代码中运行上述代码,shell=False就无需等待3秒钟即可直接打印“获取详细信息中的某些问题”。有没有办法可以在没有shell = True的情况下运行代码?请帮忙。谢谢!

unu*_*tbu 5

使用时shell=Truecommand可能是字符串。使用时shell=Falsecommand应该是一个字符串列表,第一个字符串是可执行文件,随后的字符串是要传递给可执行文件的参数。

您可以尝试使用以下命令拆分命令shlex.split

import shlex
x = subprocess.check_output(shlex.split(command), shell=False, timeout=3)
Run Code Online (Sandbox Code Playgroud)

默认情况下,当时posix=Trueshlex.split会加上反斜杠。因此,如果shlex.split不适用于您的command,则可能需要posix=False手动使用或拆分命令。