2015-04-16 42 views
-1

我正在Linux中使用python开发一个小工具。之前我使用的是Python 2.7,但现在我将其更改为Python 3.4以查看它是否可以帮助解决我的问题。当我给下面的代码:无法在子流程命令中使用shell = True时运行命令

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秒超时和打印消息“超时兄弟”。我使用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运行上面的代码,代码直接打印“取得细节时的一些问题”,而不用等待3秒。有没有什么办法可以在没有shell = True的情况下运行代码?请帮忙。谢谢!

+0

命令是什么? –

+0

另外shell = False是默认的,所以你不需要传递它。 –

回答

1

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

+0

如果在路径中有空格,分割将不起作用。 –

+1

使用'shlex'确实对此更好,恕我直言。 – jszakmeister

4

使用shell=True时,command可能是一个字符串。当使用shell=False时,command应该是一个字符串列表,第一个字符串是可执行文件,后续字符串是传递给可执行文件的参数。

你可以尝试用shlex.split分裂命令:

import shlex 
x = subprocess.check_output(shlex.split(command), shell=False, timeout=3) 

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

+0

根据命令来自何处,更好的解决方案是首先建立一个列表而不是一个字符串。 (有多少数百个SO问题关于人们做15行字符串操作来构建命令行以传递给'shlex.split'或直接传递给'check_output',并且在那些没有的15行中存在一些愚蠢的错误写在第一位?)但是,如果你有什么开始是一个字符串,那么'shlex'肯定是要走的路。 – abarnert