亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

PHP中通過exec調(diào)用python腳本報ModuleNotFoundError錯誤問題及解決方法

 更新時間:2023年07月18日 09:09:44   作者:hotaigc.cn  
這篇文章主要介紹了解決php中通過exec調(diào)用python腳本報ModuleNotFoundError錯誤,本文是在 Ubuntu 20.04 上以 ubuntu 用戶身份進行的測試,需要的朋友可以參考下

背景

出于某些原因,我們有時會在PHP中通過exec來調(diào)用Python代碼,有可能是某些功能只能用Python實現(xiàn)(或用Python實現(xiàn)比較方便),有可能是出于性能考慮(Python可以執(zhí)行耗時任務(wù))。

但我們有時會發(fā)現(xiàn),在控制臺用命令行的方式運行python腳本一切正常,在 php 中用 exec 調(diào)用就報 ModuleNotFoundError: No module named 'xxx' 錯誤。

本文是在 Ubuntu 20.04 上以 ubuntu 用戶身份進行的測試。

錯誤原因

用戶不同

這種錯誤一般都是因為執(zhí)行腳本的用戶不同導(dǎo)致的,php用exec調(diào)用python腳本時,使用的用戶一般是 www-data,而我們在控制臺一般都是 rootubuntu 用戶。

這個可以通過 whoami 命令來驗證。

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  

為什么用戶不同就會導(dǎo)致 ModuleNotFoundError: No module named 'xxx' 這個錯誤呢,根本原因還是權(quán)限問題。

權(quán)限問題

我們在控制臺寫python腳本時,一般會通過 pip[3] install [xxx]的形式安裝依賴的包,這時包一般會安裝在用戶目錄。

下面做個測試,我們安裝 python-dotenv這個包,然后查看包的安裝位置:

可以看到這個包安裝在了 /home/ubuntu/.local/lib/python3.8/site-packages 這個目錄。

下面我們試一下用 www-data 用戶的身份是否有權(quán)限調(diào)用。

Python測試代碼:

from dotenv import load_dotenv
load_dotenv()

分別用當前用戶和www-data調(diào)用:

可以看到用www-data調(diào)用時果然報ModuleNotFoundError: No module named 'dotenv'錯誤。

我們查看一下我們安裝的python-dotenvwww-data用戶是否可用:

sudo -u www-data pip3 show python-dotenv

可以看到確實是沒有的。

即然原因確定了,接下來就好辦了。

解決方案

方案一:修改web服務(wù)器用戶

即然是控制臺用戶可以運行腳本,我們把Web服務(wù)器用戶改為控制臺用戶就可以了,以 apache 為例具體步驟如下:

1.打開apache配置文件:sudo vim /etc/apache2/apache2.conf

2.更改以下兩行,將運行的用戶和組設(shè)置為自己所需的:

User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
#更改為
User ubuntu
Group ubuntu

3.重啟apache:sudo service apache2 restart

注:這種方案能解決問題,但并不好,因為權(quán)限給的太大了,有很大的安全風(fēng)險,不建議用。

方案二:給 www-data 用戶安裝python依賴庫

在安裝之前我們確認一下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目錄下。

我們來驗證一下:

sudo -u www-data python3 pyscripts/test.py

可以看到不報錯了。

到此這篇關(guān)于解決php中通過exec調(diào)用python腳本報ModuleNotFoundError錯誤的文章就介紹到這了,更多相關(guān)php調(diào)用python腳本報ModuleNotFoundError錯誤內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論