背景:最近在使用Python3.11编写脚本来获取google play中app的用户评论,脚本中需要安装多个依赖包,在本地Pycharm调试通过以后,上传到github,然后在linux服务器拉取脚本来运行,发现存在几个问题。本文将面临的问题记录下来,供自己学习,也希望其他人遇到类似问题以后,能作为一个参考。
问题1: 在本地依赖多个包,到服务器后需要手动依次多个依赖包吗?当然不是。
解决方法:
1. 在本地使用虚拟环境。在项目的根目录下执行python3 -m venv demo,其中demo为虚拟环境的名称,自己随便定义。
2. 然后执行pip3 freeze > requirements.txt,含义是用于生成一个包含当前 Python 环境中所有已安装包及其版本号的 requirements.txt
文件。
3. 执行souce demo/bin/activate 激活虚拟环境,再执行which python3,发现是虚拟环境下的Python解释器。这说明虚拟环境激活成功,或者看命令行最左面有(venv),也可以说明虚拟环境激活成功了。
4. 执行pip3 install -r requirements.txt 在虚拟环境安装所有的依赖包。上传代码到github
4. 登录服务器,来取代码。注意:服务器和本地开发环境Python版本要一致,避免出现兼容性问题。笔者本地和服务器使用的Python版本都是3.11版本
5. 拉取代码到服务器以后,发现会存在demo的一个虚拟环境目录,执行souce demo/bin/acitvate激活虚拟环境。到这里我以为自己不需要在服务器按照依赖包了。因为依赖包在本地都已经安装在venv/lib/python3.11/site-packages了。此时引出下面的第2个问题。
问题2:在服务器的虚拟环境下执行which python3 发现解释器还是服务器下的目录,不是虚拟环境下的解释器目录,执行python3 demo.py脚本,也提示依赖包没有安装。虚拟环境虽然激活了,但是解释器使用的并不是虚拟环境的。
原因:本地创建虚拟环境时,虚拟环境会包含一个独立的 Python 解释器及其相关的标准库。demo/bin/python3
会是一个指向实际 Python 解释器的符号链接,这个解释器是由 venv
创建时使用的 Python 版本。说白了,虚拟环境其实是使用的本地的/Library/Frameworks/Python.framework/Versions/3.11/bin/python3.11的解释器。而我服务器上根本没有这个目录以及对应pyhton3.11解释器,所以在服务器的虚拟环境下执行which python3还是我本地的Python解释器。
解决方法:服务器下删除原有的虚拟环境,重新创建新的虚拟环境。
1. deactivate 退出虚拟环境,执行rm -rf demo/* 删除venv目录,
2. 执行python3 -m venv demo重新创建虚拟环境,source demo/bin/activate,激活环境。
3. pip3 install -r requirements.txt,重新安装所有依赖包
4.在执行which python3 ,发现解释器的目录是虚拟环境下的。
5. 执行ls -ltr demo/bin 查看python3的链接,连接到的服务器上的Python
6. python3 demo.py也可以成功执行脚本了。
注意:此时本地和服务器项目中的.gitignore文件中要加上/demo,不要把demo虚拟环境目录再提交到github仓库中去了,否则本地和服务器的虚拟环境目录存在冲突。保证不提交到仓库中去,这样就保证了本地和服务器使用各自的解释器。拉取代码也不会覆盖彼此的demo目录。