python呼叫shell指令碼:OSError: [Errno 8] Exec format error
最近在公司專案中遇到一個指令碼呼叫問題,有個python的命令列工具使用subprocess模組啟動了一個zookeeper的shell指令碼,在執行過程中報了一個錯:OSError: [Errno 8] Exec format error,如下圖:
此時我嘗試在命令列執行紅框中的shell指令碼:執行成功,說明不是shell指令碼的問題。
然後,我懷疑是python的許可權有問題,網上查了下,說是要加上python直譯器(#!/usr/env/python),於是我就檢查了下對應的python檔案內容:確認已包含#!/usr/env/python。
接著我又擔心是執行許可權的問題,於是修改了python和shell指令碼的可執行許可權:
chmod +x XXX.py chmod +x /etc/init.d/zookeeper
最後,我懷疑是shell指令碼的直譯器有問題,此時我開啟shell指令碼(/etc/init.d/zookeeper),發現最上面沒有#!/bin/sh
我們知道,shell指令碼有兩種執行方式:
1. sh XXX.sh
2. chmod +XXX.sh; ./XXX.sh
對於第二種執行方式,腳本里面必須包含shell直譯器。
如下圖,我添加了shell直譯器(#!/bin/sh)後,python指令碼呼叫shell指令碼不報錯了。
至此問題得到了解決。
總結本次除錯過程,一共分為三步
1.手動執行shell指令碼:看指令碼是否本身執行就有問題,先不考慮python呼叫shell的問題。
2.檢查可執行許可權:shell和python指令碼均要保證該使用者有可執行許可權,不放心的話,就chmod +x 對應的指令碼。
3.檢查指令碼的直譯器:因為指令碼是解釋型語言(需要指定直譯器才能逐行執行),不是編譯型語言(編譯好之後不需要逐行翻譯解釋),如果沒有直譯器很可能會導致指令碼不可執行。
博主:測試生財
座右銘:用測試完成原始積累,用投資奔向財務自由
csdn:https://blog.csdn.net/ccgshigao
部落格園:https://www.cnblogs.com/qa-freeroad/