天天看點

python調用shell腳本:OSError: [Errno 8] Exec format error

最近在公司項目中遇到一個腳本調用問題,有個python的指令行工具使用subprocess子產品啟動了一個zookeeper的shell腳本,在執行過程中報了一個錯:OSError: [Errno 8] Exec format error,如下圖:

python調用shell腳本:OSError: [Errno 8] Exec format error
此時我嘗試在指令行執行紅框中的shell腳本:執行成功,說明不是shell腳本的問題。
python調用shell腳本:OSError: [Errno 8] Exec format error

然後,我懷疑是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

python調用shell腳本:OSError: [Errno 8] Exec format error

我們知道,shell腳本有兩種執行方式:

1. sh XXX.sh

2. chmod +XXX.sh; ./XXX.sh

對于第二種運作方式,腳本裡面必須包含shell解釋器。

如下圖,我添加了shell解釋器(#!/bin/sh)後,python腳本調用shell腳本不報錯了。

python調用shell腳本:OSError: [Errno 8] Exec format error

 至此問題得到了解決。

總結本次調試過程,一共分為三步:

1.手動執行shell腳本:看腳本是否本身運作就有問題,先不考慮python調用shell的問題。

2.檢查可執行權限:shell和python腳本均要保證該使用者有可執行權限,不放心的話,就chmod +x 對應的腳本。

3.檢查腳本的解釋器:因為腳本是解釋型語言(需要指定解釋器才能逐行執行),不是編譯型語言(編譯好之後不需要逐行翻譯解釋),如果沒有解釋器很可能會導緻腳本不可執行。

部落客:測試生财(一個不為996而996的測開碼農)

座右銘:專注測試開發與自動化運維,努力讀書思考寫作,為内卷的人生奠定财務自由。

内容範疇:技術提升,職場雜談,事業發展,閱讀寫作,投資理财,健康人生。

csdn:https://blog.csdn.net/ccgshigao

部落格園:https://www.cnblogs.com/qa-freeroad/

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

微信公衆号:測試生财(定期分享獨家内容和資源)

python調用shell腳本:OSError: [Errno 8] Exec format error