django2.2升级:python和sudo python的区别
一. 简介
django出了最新的2.2版本,正好升级一波.
安装的时候虽然sqlite升级到了最新的3.28.0版本,并且命令行方式启动django没有问题,但是通过supervisor启动的时候,还是会报"SQLite 3.8.3 or later is required (found 3.7.17)",排查了一天,最终发现是python和sudo python之间区别的问题.
二. 现象
网上搜索了下,问题简化下来是如下的现象.
执行python3
命令,显示sqlite3版本号是3.28.0
[root@localhost ~]# python3
Python 3.6.6 (default, Mar 29 2019, 00:03:27)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> sqlite3.sqlite_version
'3.28.0'
执行sudo python3
命令,显示sqlite3版本号是3.7.17
[root@localhost ~]# sudo python3
Python 3.6.6 (default, Mar 29 2019, 00:03:27)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> sqlite3.sqlite_version
'3.7.17'
三. 原因
原因是在使用sudo模式执行程序的时候,系统会自动重置环境变量.
具体是/etc/sudoers文件中,有Defaults env_reset这个设置.
重置PATH和LD_LIBRARY_PATH后,python定位到的sqlite3还是以前的3.7.17版本,就有了上面的现象.
四. 解决方法
修改/etc/sudoers文件,在"Defaults env_reset"后面,加上保留PATH和LD_LIBRARY_PATH的配置.
/etc/sudoers
Defaults env_reset
# sudo命令时会重置环境变量,这儿保留PATH、LD_LIBRARY_PATH变量
Defaults env_keep += "PATH LD_LIBRARY_PATH"
五. supervisord
supervisord方式管理的程序,需要先杀掉supervisord,再重新启动后,这个配置才能生效.
killall supervisord
supervisord -c /etc/supervisord.conf
六. 结尾
这个系统默认配置不知道是出于什么考虑,这么修改可能会有问题.
不过先这样吧,linux使用经验太少,后面有问题再说.
参考:
- https://blog.csdn.net/Yaokai_AssultMaster/article/details/80447809
- https://blog.csdn.net/u010878408/article/details/80580813