wangbin
  • wangbin
  • 2019-04-25
  • IT

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使用经验太少,后面有问题再说.

参考:

  1. https://blog.csdn.net/Yaokai_AssultMaster/article/details/80447809
  2. https://blog.csdn.net/u010878408/article/details/80580813