为什么jsonpickle库桌面运行正常,从PHP调用时却无法加载?
问题根源与解决方法
根本原因
该问题由Python第三方包的安装作用域和权限差异导致:
- 初始用普通用户执行
pip3 install jsonpickle时,包仅安装在当前用户的私有site-packages目录下,只有该用户身份运行Python脚本时才能正常加载 - PHP调用Python脚本时,执行进程的身份是Web服务运行用户(通常是
www-data、apache、nginx等低权限系统用户),无权访问普通用户的私有目录下的安装包,仅import jsonpickle语句就会触发导入错误,直接导致脚本执行失败 - 可正常使用的datetime属于Python标准库,其余早前安装的第三方库也属于全局公共安装,所有用户都有权限加载,因此无同类问题
解决方案逻辑
改用sudo pip3 install jsonpickle安装时,包会被安装到系统全局的site-packages目录下,所有用户(包括Web服务运行用户)都有权限访问加载,因此问题解决。
同类问题快速排查方法
后续遇到类似PHP调用Python脚本失败的场景,可通过以下方式快速定位:
- 在
shell_exec调用时同时捕获标准错误输出,直接查看Python脚本的运行报错:
$json = shell_exec('python3 /var/www/py/trivial.py 2>&1');
- 在Python脚本中增加异常捕获,将错误写入可访问的日志文件:
import traceback try: import jsonpickle # 其余业务代码 except Exception as e: with open('/tmp/py_script_err.log', 'a', encoding='utf-8') as f: f.write(traceback.format_exc())
- 执行
pip3 show [包名]查看包的安装路径,全局安装的路径通常为/usr/local/lib/python3.x/dist-packages/,普通用户私有安装路径通常为/home/用户名/.local/lib/python3.x/site-packages/
内容的提问来源于stack exchange,提问作者Michael Stern
相关产品推荐
相关产品推荐

