PHP中通過exec調(diào)用python腳本報(bào)ModuleNotFoundError錯(cuò)誤問題及解決方法
背景
出于某些原因,我們有時(shí)會(huì)在PHP中通過exec來調(diào)用Python代碼,有可能是某些功能只能用Python實(shí)現(xiàn)(或用Python實(shí)現(xiàn)比較方便),有可能是出于性能考慮(Python可以執(zhí)行耗時(shí)任務(wù))。
但我們有時(shí)會(huì)發(fā)現(xiàn),在控制臺(tái)用命令行的方式運(yùn)行python腳本一切正常,在 php 中用 exec
調(diào)用就報(bào) ModuleNotFoundError: No module named 'xxx'
錯(cuò)誤。
本文是在 Ubuntu 20.04 上以 ubuntu
用戶身份進(jìn)行的測(cè)試。
錯(cuò)誤原因
用戶不同
這種錯(cuò)誤一般都是因?yàn)閳?zhí)行腳本的用戶不同導(dǎo)致的,php用exec
調(diào)用python腳本時(shí),使用的用戶一般是 www-data
,而我們?cè)诳刂婆_(tái)一般都是 root
或 ubuntu
用戶。
這個(gè)可以通過 whoami
命令來驗(yàn)證。
php代碼如下:
$pythonScript = "whoami"; Log::info("exec script:" . $pythonScript); exec($pythonScript, $output, $returnValue); Log::info("exec output:" . json_encode($output)); Log::info("exec returnValue:" . $returnValue);
輸出如下:
[2023-07-13 10:34:27] local.INFO: exec script:whoami
[2023-07-13 10:34:27] local.INFO: exec output:["www-data"]
[2023-07-13 10:34:27] local.INFO: exec returnValue:0
為什么用戶不同就會(huì)導(dǎo)致 ModuleNotFoundError: No module named 'xxx'
這個(gè)錯(cuò)誤呢,根本原因還是權(quán)限問題。
權(quán)限問題
我們?cè)诳刂婆_(tái)寫python腳本時(shí),一般會(huì)通過 pip[3] install [xxx]
的形式安裝依賴的包,這時(shí)包一般會(huì)安裝在用戶目錄。
下面做個(gè)測(cè)試,我們安裝 python-dotenv
這個(gè)包,然后查看包的安裝位置:
可以看到這個(gè)包安裝在了 /home/ubuntu/.local/lib/python3.8/site-packages
這個(gè)目錄。
下面我們?cè)囈幌掠?www-data
用戶的身份是否有權(quán)限調(diào)用。
Python測(cè)試代碼:
from dotenv import load_dotenv load_dotenv()
分別用當(dāng)前用戶和www-data
調(diào)用:
可以看到用www-data
調(diào)用時(shí)果然報(bào)ModuleNotFoundError: No module named 'dotenv'
錯(cuò)誤。
我們查看一下我們安裝的python-dotenv
對(duì)www-data
用戶是否可用:
sudo -u www-data pip3 show python-dotenv
可以看到確實(shí)是沒有的。
即然原因確定了,接下來就好辦了。
解決方案
方案一:修改web服務(wù)器用戶
即然是控制臺(tái)用戶可以運(yùn)行腳本,我們把Web服務(wù)器用戶改為控制臺(tái)用戶就可以了,以 apache 為例具體步驟如下:
1.打開apache配置文件:sudo vim /etc/apache2/apache2.conf
2.更改以下兩行,將運(yùn)行的用戶和組設(shè)置為自己所需的:
User ${APACHE_RUN_USER} Group ${APACHE_RUN_GROUP} #更改為 User ubuntu Group ubuntu
3.重啟apache:sudo service apache2 restart
注:這種方案能解決問題,但并不好,因?yàn)闄?quán)限給的太大了,有很大的安全風(fēng)險(xiǎn),不建議用。
方案二:給 www-data 用戶安裝python依賴庫
在安裝之前我們確認(rèn)一下www-data用戶是否沒有安裝python-dotenv包:
sudo -u www-data pip3 show python-dotenv
下面我們給 www-data 用戶安裝python-dotenv包:
#安裝 sudo -u www-data pip3 install python-dotenv #顯示安裝路徑 sudo -u www-data pip3 show python-dotenv
我們可以看到,安裝到了 /var/www/.local/lib/python3.8/site-packages
目錄下。
我們來驗(yàn)證一下:
sudo -u www-data python3 pyscripts/test.py
可以看到不報(bào)錯(cuò)了。
到此這篇關(guān)于解決php中通過exec調(diào)用python腳本報(bào)ModuleNotFoundError錯(cuò)誤的文章就介紹到這了,更多相關(guān)php調(diào)用python腳本報(bào)ModuleNotFoundError錯(cuò)誤內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 下載python中Crypto庫報(bào)錯(cuò):ModuleNotFoundError: No module named ‘Crypto’的解決
- Python報(bào)錯(cuò):ModuleNotFoundError的解決辦法
- python命令行執(zhí)行腳本找不到模塊ModuleNotFoundError問題
- Python?ModuleNotFoundError:?No?module?named?‘xxx‘可能的解決方案大全
- Python打包文件執(zhí)行報(bào)錯(cuò):ModuleNotFoundError: No module named ‘pymssql‘的解決方法
- python命令行運(yùn)行報(bào)錯(cuò)ModuleNotFoundError:No module named‘XXX‘找不到自定義模塊
- 如何解決Python中ModuleNotFoundError錯(cuò)誤
- 解決Python中的ModuleNotFoundError:?No?module?named?'paddle'錯(cuò)誤
- Python解決ModuleNotFoundError: No module named 'PIL'的問題
- Python報(bào)錯(cuò)ModuleNotFoundError: No module named ‘tensorboard‘的解決方法
- Python中ModuleNotFoundError: No module named ‘timm’的錯(cuò)誤解決
相關(guān)文章
詳解PHP使用Redis存儲(chǔ)session時(shí)的一個(gè)Warning定位
本篇文章主要介紹了PHP使用Redis存儲(chǔ)session時(shí)的一個(gè)Warning定位,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07PHPMailer郵件發(fā)送的實(shí)現(xiàn)代碼
本篇文章介紹了,PHPMailer郵件發(fā)送的實(shí)現(xiàn)代碼。需要的朋友參考下2013-05-05php結(jié)合ajax實(shí)現(xiàn)贊、頂、踩功能實(shí)例
這篇文章主要介紹了php結(jié)合ajax實(shí)現(xiàn)贊、頂、踩功能實(shí)例,包含PHP代碼、JS代碼和數(shù)據(jù)庫端代碼,非常詳細(xì),入門非常好的例子,需要的朋友可以參考下2014-05-05實(shí)例介紹PHP刪除數(shù)組中的重復(fù)元素
在本文里小編給大家分享了關(guān)于PHP如何刪除數(shù)組中的重復(fù)元素的相關(guān)知識(shí)點(diǎn)和步驟,需要的朋友們學(xué)習(xí)下。2019-03-03PHP使用FFmpeg獲取視頻播放總時(shí)長(zhǎng)與碼率等信息
這篇文章給大家分享了利用PHP中的FFmpeg讀取視頻播放時(shí)長(zhǎng)與碼率等信息,有需要的朋友們可以參考借鑒。下面來一起看看吧。2016-09-09