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 进程
修改 /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 为项目创建独立的 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]
|
退出当前的venv环境:
创建一个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
|
重新加载:
查看状态:
丢,又报同样的错,那好吧,冷静一下,之前是成功过的,会不会是之前的进程没关,端口被占用了呢?查看 log 应该也是可以的。先查询端口占用情况吧
1 2
| netstat -lnp|grep 9001 tcp 0 0 0.0.0.0:9001 0.0.0.0:* LISTEN 5707/python3
|
好吧,
再来
1 2 3
| supervisorctl reload supervisorctl status hcz RUNNING pid 8605, uptime 0:00:07
|
OK