我正在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的情况下运行代码吗?请帮忙。谢谢!
答案 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
。