Centos6.5:python2 和 python3 共存下,supervisor 管理 python web 进程,使用 virtualenv 创建独立环境

Centos6.5: python2 和 python3 共存下,supervisor 管理 python web 进程,使用 virtualenv 创建独立环境

supervisor介绍

由于 supervisor 目前不兼容 python3,而且在 centos6.5 ,默认 python 版本是2.6
;而自己做的项目是 python3.5,不能直接替换默认的2.6,只能共存,不然很多依赖于 python2.6 的工具不能用,比如 yum

安装 python3.5.3

1
2
3
4
5
wget https://www.python.org/ftp/python/3.5.3/Python-3.5.3.tgz
tar zxvf Python-3.5.3.tgz
cd Python-3.5.3.tgz
./configure --prefix=/usr/local/python3
make && make install

如果直接运行 python3 提示没有找到,就运行下面这个语句

1
ln -fs /usr/local/python3/bin/python3 /usr/bin/python3

安装 supervisor

使用 supervisor 进行管理 python web 进程

1
pip3 install supervisor

修改 /etc/supervisord.conf 配置文件,在最下面加上:

1
2
3
4
5
6
7
8
9
10
[program:hcz]
command =python3 /usr/local/nginx/html/pyhcz/src/app.py
directory = /usr/local/nginx/html/pyhcz/src
user = www-data
startsecs = 3
redirect_stderr = true
stdout_logfile_maxbytes = 50MB
stdout_logfile_backups = 10
stdout_logfile = /usr/local/nginx/html/pyhcz/app.log

command 指定命令,直接 python3 xx.py 是会报错的,
由于版本环境的问题,指定了 python3 也并不能切换到 3 的环境,
不知道是不是因为 supervisor 用的是 python2 的环境导致的,
导致后续执行所在的环境仍为2的。为了确保正确性,我再试一次。
依然报错:

1
FATAL Exited too quickly (process log may have details)

查看日志( /usr/local/nginx/html/pyhcz/app.log):

1
2
3
4
5
6
Traceback (most recent call last):
File "/usr/local/nginx/html/pyhcz/src/app.py", line 6, in <module>
import database
File "/usr/local/nginx/html/pyhcz/src/database.py", line 3, in <module>
import aiomysql
ImportError: No module named 'aiomysql'

我在 python3 下是已经有安装 aiomysql 的,pip3 install aiomysql,而且 aiomysql 不支持 python2

是的,python2 和 python3 已经能共存了,但是还是有点小问题,可老子就是要用 supervisor (目前不兼容 python3),那就只能变着法子来了。

virtualenv 介绍

在项目目录里,使用 virtualenv 为项目创建独立的 python 运行环境

1
2
cd /usr/local/nginx/html/pyhcz
virtualenv --no-site-packages venv

成功后可使用命令进入该项目的环境

1
source venv/bin/activate

进入后,命令提示符会变,有个(venv)前缀,表示当前环境是一个名为venv的Python环境。之后就可以安装所需要的第三方库了:

1
(venv) [root@localhost pyhcz]# pip install aiomysql

退出当前的venv环境:

1
deactivate

创建一个sh脚本(用 shell 脚本去执行,文件:/usr/local/pyhcz.sh):

1
2
3
4
#!/bin/sh
cd /usr/local/nginx/html/pyhcz
source venv/bin/activate
python3 src/app.py

然后 /etc/supervisord.conf 的 command 修改为:

1
command =/usr/local/pyhcz.sh

其他不变

最后重启 supervisor:

1
service supervisord restart

重新加载:

1
supervisorctl reload

查看状态:

1
supervisorctl status

丢,又报同样的错,那好吧,冷静一下,之前是成功过的,会不会是之前的进程没关,端口被占用了呢?查看 log 应该也是可以的。先查询端口占用情况吧

1
2
netstat -lnp|grep 9001
tcp 0 0 0.0.0.0:9001 0.0.0.0:* LISTEN 5707/python3

好吧,

1
kill -9 5707

再来

1
2
3
supervisorctl reload
supervisorctl status
hcz RUNNING pid 8605, uptime 0:00:07

OK