因为我是Python零基础,所以如何部署全靠百度,这边我把我查到的资料和安装使用过程中遇到写下来,如果有写的不对的或者有更好的方式,欢迎评论指出。
一、Python环境安装
网上有很多安装教程,可以自行百度安装,我参考的是这个(仅第一步安装python):Linux部署python_Xue丶的博客-CSDN博客_linux部署pythonLinux、服务器、pythonhttps://blog.csdn.net/weixin_45783664/article/details/126784650 安装过程中午发现高版本的安装会出现很多错误,且我本地开发过程中也发现高版本的会有很多问题存在,所以本地装的版本是Python 3.7.7,Linux与之匹配的版本是Python 3.8.10,这是我安装的俩个版本的资源:
链接:https://pan.baidu.com/s/1gwd6G81X5-peDf3fJmF4vw
提取码:hngV
二、部署环境安装
先部署我查询的资料大多是通过虚拟环境进行部署,原因大致是:不同的工程会依赖不同的库,当部署多个工程或同一工程下的模块很多时,会造成依赖包的冲突的情况。这里我选择的是virtualenv,它的作用是可以在同一个系统下帮我们建立多个互不相同并且互不干扰的虚拟环境(注意:这里的虚拟环境不是虚拟一个新的系统或者是一个新的python,而是虚拟出新的python模块环境)。此外网上有说virtualenv虚拟环境不好管理,需要记住每个项目的目录,所以推荐使用virtualenvwrapper,它是virtualenv的扩展包,用于更方便管理虚拟环境。
来源于知乎:
Virtualennv
virtualennv用于创建独立的Python环境, 多个python相互独立,互不影响,它能够:
- 在没有权限的情况下安装新套件
- 不同应用可以使用不同的套件版本
- 套件升级不影响其他应用。
Virtualenvwrapper Virtualennv
Virtaulenvwrapper是virtualenv的扩展包,用于更方便管理虚拟环境,它可以做:
- 将所有虚拟环境整合在一个目录下
- 管理(新增,删除,复制)虚拟环境
- 快速切换虚拟环境
接下来是安装步骤:
1.安装Virtualennv:
pip3 install virtualenv
2.安装Virtualenvwrapper:
(1)安装virtualenvwrapper
pip install virtualenvwrapper
这步安装过程可能会出现的一些错误及解决办法:
错误1:
尝试执行如下命令:
sudo pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pbr
sudo pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --no-deps stevedore
sudo pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --no-deps virtualenvwrapper
错误2:
尝试更新setuptools:
pip install --upgrade setuptools
(2)创建存放虚拟环境的目录
mkdir /opt/virtualenvs
(3)修改.bashrc文件
vi ~/.bashrc
## 在其中添加如下代码:
# 存放虚拟环境的位置
export WORKON_HOME=/opt/virtualenvs
# 使用的python3版本的解析器
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python
# virtualenv运行文件地址,这个地址
export VIRTUALENVWRAPPER_VIRTUALENV=/opt/python/Python-3.7.7/bin/virtualenv
# virtualenvwrapper.sh运行文件地址
source /opt/python/Python-3.7.7/bin/virtualenvwrapper.sh
如果找不到对应路径可通过如下命令查找:
find / -name virtualenvwrapper.sh
find / -name virtualenv
若找不到virtualenvwrapper.sh,可能是你用pip3安装的virtualenvwrapper尝试如下命令,卸载重新安装:
pip3 uninstall virtualenvwrapper
pip install virtualenvwrapper
保存退出后在,执行如下命令使之生效:
source ~/.bashrc
【常用命令】
virtualenvwrapper --help -- 查看命令
workon -- 列出虚拟环境列表
lsvirtualenv -- 同上
mkvirtualenv [虚拟环境名称] -- 创建虚拟环境(创建将自动进入环境,创建完后目录在虚拟环境目录下)
workon [虚拟环境名称] -- 切换进入虚拟环境
rmvirtualenv [虚拟环境名称] -- 删除虚拟环境
deactivate -- 退出虚拟环境
三、部署启动工程
(1)本地生成依赖清单requirements.txt(可在Pycharm的Terminal里执行如下命令)
pip freeze > requirements.txt
(2)上传依赖清单到新创建虚拟环境名下
(3)安装依赖清单里的库(进入上传清单的目录下执行)
pip3 install -r requirements.txt
(4)上传编写好的python文件到虚拟环境目录下
(5)执行(log位置可自行指定)
nohup python3 main.py >> start.log 2>&1
(6)设置定时任务,定时自动执行爬虫脚本(这块目前还没完全弄清楚)
第一种方式:编写shell脚本,通过Linux自带的crontab设置定时执行
第二种方式:直接在Linux的crontab中编辑定时任务执行Python文件
【现在有个问题是使用了virtualenv虚拟环境,所以需要考虑如何编写脚本或定时任务来成功激活执行Python工程】
以下只尝试了第二种方式,第一种方式未成功运行
方法一:设置python脚本运行时的解释器路径
在python脚本行首加上解释器路径,例如:
#!/usr/bin/python
这种方式缺点就是需要在编写好的Python脚中增加了额外的与脚本本身逻辑无关与部署有关的代码(个人感觉代码有点混淆在一起不太好,但确实有效)。另外在运行中发现一些错误,如:
网上查到的解决方案也是在Python文件的第一行添加如下代码解决 ( -_-|||)
# -*- coding: utf-8 -*-
注:类似这种UTF-8的错误会有很多,目前没有找到较好的解决办法。所以在Python文件中不管是注释还是打印的内容里尽量避免使用中文及中文标点字符等。
方法二:crontab中设置启动python脚本的解释器路径
* * * * * /usr/bin/python /opt/virtualenvs/demo/main.py > /opt/virtualenvs/demo/start.log 2>&1 &
同样有效,但是运行中同样有可能出现方法一中举的那种错误,解决方法还是在Python文件首行添加代码。
如果脚本所在的project路径需要加到PYTHONPATH中,则先cd到这个路径下在执行上述命令即可
* * * * * cd /opt/virtualenvs/Lottery/; /usr/bin/python /opt/virtualenvs/demo/main.py > /opt/virtualenvs/demo/start.log 2>&1 &
另外如果运行发现错误:ModuleNotFoundError: No module named 'requests',可以尝试运行一下 which python ,看是否报错,如果报如下错误:
/usr/bin/which: no python in (/opt/python/Python-3.7.7/bin:/opt/java/jdk1.8.0_333/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin),继续执行which python2或者which python3找到正确的路径添加软链接即可
ln -s /opt/python/Python-3.7.7/bin/python3 /usr/bin/python
如果任然报无法导入包的错误,可以尝试重新安装一次依赖 pip3 install -r requirements.txt
或者尝试删除其他代码,只留一句导入代码,多尝试一下,我这边尝试了好久才搞定,也不是很清楚为什么会出现这种情况
【常用Crontab命令】
systemctl start crond.service #启动服务
systemctl stop crond.service #关闭服务
systemctl status crond.service #查看服务状态
systemctl restart crond.service #重启服务
crontab -l #查看任务列表
crontab -e #编辑任务
tail -f /var/log/cron #查看定时任务日志
【遗留问题】
就是关于日志的处理,因为是Crontab定时启动Python去执行爬虫抓取数据,所以每次的日志会自动覆盖上一次的日志。若某次抓取失败,几天后想要查看日志会发现日志已经被覆盖无法查看。
解决设想:
第一种设想:每次生成的日志文件名动态不重复,但是不清楚如何在Crontab中进行设置,如果通过方式一的shell脚本实现定时,或许可以将日志文件名改成时间的动态名字,这样就不会覆盖日志文件了。
第二种设想:将Python中要输出的日志也保存到数据库中,感觉这种方式会比较简单。