如何优雅的部署Python应用到Linux服务器? | 您所在的位置:网站首页 › python开发linux › 如何优雅的部署Python应用到Linux服务器? |
文章目录
1 前言2 安装Python3环境2.1 安装所需的编译环境2.2 下载Python源码包2.3 解压 python-3.9.5 源码包2.4 安装 python32.5 设置软链接
3 部署python应用3.1 将本地开发环境的依赖项目生成清单文件3.2 将Python项目上传到服务器3.3 为项目创建虚拟环境3.4 启动python服务3.5 本示例相关代码
1 前言
最近使用Python写了个小脚本,本地可以运行了,但是,如何把python脚本部署到Linux环境的服务器上呢? 废话不多说,直接上干货~~~ 2 安装Python3环境 2.1 安装所需的编译环境执行命令: yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make 官网地址: https://www.python.org/ 最新源码包下载地址: https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tar.xz 这里,笔者以3.9.5版本为例,执行命令,下载源码包: wget https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tar.xz 执行解压命令: tar -Jxvf Python-3.9.5.tar.xz -C /usr/local -C表示将 python 源码包解压到那个目录下 -J 解压命令(*.xz) 注:tar.gz tar.bz2 tar.xz分别使用z、j、J解压 -x 从 tar 包中把文件提取出来 -v 解压时显示详细信息 -f 指定解压文件注: 这里源码包可以放在任意位置,后续安装成功后,这个解压源码包的内容可以删除的 2.4 安装 python3切换至解压后的python主目录 执行命令: cd /usr/local/Python-3.9.5/ 在python主目录Python-3.9.5下执行以下命令配置python: ./configure --prefix=/usr/local/Python-3.9.5 (其中–prefix是指定python的安装路径,这里使用的源码包安装方式,解压的是源码,安装到哪个位置使用--prefix指定) 编译安装python 执行命令: make && make install 可以使用这个命令查看, python3 是否安装成功了:/usr/local/Python-3.9.5/bin/pip3 list 先查看下自己 centos 服务器的已安装的 Python 版本是哪个,执行命令: python -V
查看 python 可执行文件的路径 使用命令: which python
创建python软链接 现在就是需要将 python3 这个文件建立软连接,使 python 指向 python3 即可,首先执行命令mv python python.back 把原来的python做一个备份,然后执行命令: ln -s /usr/local/Python-3.9.5/bin/python3.9 /usr/bin/python 若找到 python 这个指向为红色显示的,证明创建错误了,python3 的地址错误了,需要重新删除python后重新指定(这里笔者故意指定错误,给老铁们演示下错误的效果): 至此,python3基础环境就安装完成了,下面开始部署python应用 3 部署python应用 3.1 将本地开发环境的依赖项目生成清单文件在本地的开发环境中,env下执行: pip3 freeze >requirements.txt 清单文件将会生成在当前项目目录下,内容如下所示: APScheduler==3.7.0 pytz==2021.1 six==1.16.0 tzlocal==2.1将生成后的文件上传到Linux服务器 3.2 将Python项目上传到服务器这里可以使用wincp软件,或者直接使用rz命令都可以,把python项目上传到Linux服务器上 3.3 为项目创建虚拟环境一般每个不同的项目都会依赖各自的库,有些库的版本不一样会引起冲突,为了解决这个问题,需要使用虚拟环境,Python可以在每个项目目录下创建各自的虚拟环境,项目所依赖的包就在当前目录环境下,这样避免了库版本的冲突,也方便相同操作系统间可以快速的拷贝项目运行。 在Linux服务器上为项目创建虚拟环境,并安装项目所需的依赖 切换到pip3所在的目录,执行以下命令:cd /usr/local/Python-3.9.5/bin 安装虚拟环境 pip3 install virtualenv 执行命令是出现:bash: pip: command not found...这时候怎么办呢??? 做一个软连接即可,首先查下安装路径: find / -name pip ,笔者的路径为/usr/local/Python-3.9.5/bin/pip3 然后做个软连接: ln -sv /usr/local/Python-3.9.5/bin/pip3 /usr/bin/pip3 然后再次执行:pip3 install virtualenv 注意:这里使用的是 pip3,若是直接使用 pip 则对应的是 python2 版本的 创建虚拟环境 /opt/project/python 执行命令: virtualenv /opt/project/python/test-python 切换到虚拟环境所在的目录 执行命令: cd /opt/project/python/test-python 启用虚拟环境 执行命令:source ./bin/activate 安装依赖清单里的库 执行命令: pip3 install -r /opt/project/python/test-python/requirements.txt 列出当前虚拟环境所安装的依赖库 执行命令: pip3 list 在指定环境下完成任务后关闭虚拟环境 这样一来在运行python就是全局的python环境,在虚拟环境下执行命令: deactivate 注:这里面有的依赖可能不存在,可以切换不同的镜像尝试 使用命令: cd /root/.pip && vim ./pip.conf ## Note, this file is written by cloud-init on first boot of an instance ## modifications made here will not survive a re-bundle. [global] index-url=http://mirrors.aliyun.com/pypi/simple/,http://pypi.hustunique.com/simple/,http://pypi.sdutlinux.org/simple/,http://pypi.mirrors.ustc.edu.cn/simple/,http://pypi.douban.com/simple/ [install] trusted-host=mirrors.aliyun.com,pypi.hustunique.com,pypi.sdutlinux.org,pypi.mirrors.ustc.edu.cn,pypi.douban.com常见国内镜像源: 豆瓣: http://pypi.douban.com/simple/ 阿里: http://mirrors.aliyun.com/pypi/simple/ 华中理工大学: http://pypi.hustunique.com/simple/ 山东理工大学: http://pypi.sdutlinux.org/simple/ 中国科学技术大学: http://pypi.mirrors.ustc.edu.cn/simple/ 尝试了上面的方法,还是有好多下载失败的,不得不采用离线方式: ERROR: Could not find a version that satisfies the requirement APScheduler==3.7.0 (from versions: none) ERROR: No matching distribution found for APScheduler==3.7.0 项目中,导出依赖包: pip freeze > requirements.txt 在项目中,下载依赖的离线包,然后上传到服务器: pip download -r ./requirements.txt -d ./dependencies 把离线包上传到Linux服务器上,安装依赖包: pip install --no-index --find-links=./dependencies -r requirements.txt 其中,--find-links指定的是包文件的存放地址,-r指定的是txt文件的位置 使用以下命令,启动python服务: nohup python main.py 至此,基础的应用部署就完成了,实际上,python部署应用确实复杂的多,以上这种部署应用的方式不是很方便,后续有机会在完善吧~ 3.5 本示例相关代码 #!/usr/bin/python3 # coding=utf-8 import datetime from apscheduler.schedulers.background import BlockingScheduler def timedTask(): print(datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]) ''' 新建一个 schedulers (调度器) 。 添加一个调度任务(job stores)。 运行调度任务。 ''' if __name__ == '__main__': # 创建后台执行的 schedulers scheduler = BlockingScheduler() # 添加调度任务 # 调度方法为 timedTask,触发器选择 interval(间隔性),间隔时长为 2 秒 scheduler.add_job(timedTask, 'interval', seconds=2) # 启动调度任务 scheduler.start()参考资料: https://www.jb51.net/article/194150.htm https://blog.csdn.net/sergiojune/article/details/88076805 写博客是为了记住自己容易忘记的东西,另外也是对自己工作的总结,希望尽自己的努力,做到更好,大家一起努力进步! 如果有什么问题,欢迎大家一起探讨,代码如有问题,欢迎各位大神指正! 给自己的梦想添加一双翅膀,让它可以在天空中自由自在的飞翔! |
CopyRight 2018-2019 实验室设备网 版权所有 |