我正在尝试创建一个网络服务器,它最终使用以下命令从 PHP 代码调用 python 脚本(“MyScript.py”)
echo exec("MyScript.py ....some arguments")
MyScript.py 实际上包含使用 RDkit 和其他模块(如 numpy)的代码。
当我从用户(MKT)运行这个 MyScript.py 时......它就像一个魅力。
但是当它从服务器的 PHP 脚本执行时,问题就出现了。 /var/www/log/apache2/error.log中的错误信息如下:
ImportError: No module named rdkit
Traceback (most recent call last):
File "./preditar/preditar.py", line 7, in <module>
from rdkit import Chem
我的 rdkit 安装在 /opt/RDKit_2013_06_1/rdkit/ 中,如果从 MKT 用户运行它们,结果如下
MKT@mypc$ python -v
然后在python环境中:
import rdkit
这是输出:
import rdkit # precompiled from /opt/RDKit_2013_06_1/rdkit/\__init__.pyc
我认为执行此操作的用户 www-data 无权访问此模块...那么如何在 MyScript.py 中导入它???
注意:当我将 MyScript.py 修改为一个简单的脚本(仅创建一个文件并向其写入数据)时...它可以正常工作,没有任何问题,这意味着我没有任何与权限相关的问题。
看起来像 Python 导入搜索路径有问题。尝试像这样更改导入:
import sys
sys.path.insert(0, "/opt/RDKit_2013_06_1")
import rdkit
通过 sys.path.insert 将用户 ubuntu 找到的缺失路径添加到用户 www-data 不可扩展,也不可能(因为 www-data 用户无法访问 ubuntu 用户路径),因此最好的方法是安装python 模块(在本例中为 rdkit)以 www-data 用户可以访问的方式
sudo mkdir /var/www/.local
sudo mkdir /var/www/.cache
sudo chown www-data:www-data /var/www/.local
sudo chown www-data:www-data /var/www/.cache
sudo -H -u www-data pip install rdkit
https://nocurve.com/2018/04/23/running-python-script-from-php-as-www-data/