2015-04-16 41 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