1. 程式人生 > 實用技巧 >python呼叫shell指令碼:OSError: [Errno 8] Exec format error

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/

51cto:https://blog.51cto.com/14900374