在子进程命令中无法运行没有shell = True的命令

时间:2015-04-16 09:49:24

标签: python python-3.x subprocess

我正在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运行上面的代码,代码就会直接打印出#34;在获取细节方面的一些问题"没有等待3秒。有什么办法可以在没有shell = True的情况下运行代码吗?请帮忙。谢谢!

2 个答案:

答案 0 :(得分:5)

使用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或手动拆分命令。

答案 1 :(得分:1)

尝试使用command.split()拆分命令。字符串将在shell=True的情况下有效,但对于shell=False,它需要一个args列表。但是,请注意拆分在某些情况下不起作用,例如路径中有空格等。我建议在这种情况下使用shlex