使用Conda Pack打包Python独立运行时环境

版本说明:

python=2.7

Conda 的Pack工具,可以说是让我发现了新大陆。之前有个项目使用它解决了一个棘手的问题,一直没有整理相关笔记,时间长了容易淡忘,恰好有同事问我如何实现的,这里就重新整理一下。

1 棘手问题描述

简单描述一下项目中遇到的这个棘手问题:

这个项目是一个Python2.7开发的Flask服务,它里面有不少依赖需要使用pip安装,并且在网络不好的情况下容易下载失败。要求是能够让用户能够快速部署,几乎不做复杂的操作,就能够运行我们的项目,甚至是目标主机没有联网的情况下,都能够直接运行。另外是,不考虑目标主机的Linux操作系统,不管是Ubuntu还是CentOS只要是Linux,就能够保证正常运行。另外,目前大多数系统都安装了Python3的环境,我们使用的Python2环境不能够影响到已有的环境。

当时想到了一些解决方法:

  1. 编写部署脚本,自动安装依赖。这个方法虽然能能够进行快速部署,但是安装依赖,需要考虑网络,不符合需求。
  2. 使用Pyinstaller等一些工具,可以打包成可执行文件。当时觉得这个方法可行,符合需求,但是由于我们这个Flask服务,里面依赖比较多,而且比较庞大。导致使用PyInstaller打包的时候,出现各种问题,经过几天的尝试,最终我还是放弃了,因为总是出现一些莫名其妙的问题,网上一些教程都是Hello World级别的,无法参考。也可能是个人能力问题,不过我还是放弃了。

2 使用Conda Pack解决问题

下面来讲一下,如何使用Conda Pack解决问题。思路相对来说比较简单,而且是容错率较高,不会出现莫名其妙的问题。思路是这样的:

  1. 首先使用Conda创建一个Python虚拟环境
  2. 激活创建的虚拟环境
  3. 在虚拟环境中安装项目运行时的依赖
  4. 使用Pack打包运行环境
  5. 将运行环境与项目源码一块发布

Pack打包的运行环境与项目源码一块拷贝的目标主机,解压后,激活运行环境,就可以直接运行项目了。

3 Conda Pack使用

从0到1讲一下如何使用Conda Pack打包一个Flask项目运行环境。

3.1 准备环境

准备一台centos机器,配置随意,可以访问互联网。

3.1.1 安装miniconda

Miniconda是conda的免费最小安装程序。它是Anaconda的小型引导程序版本,仅包含conda,Python,它们依赖的软件包以及少量其他有用的软件包,包括pip,zlib和其他一些软件包。官网地址:https://docs.conda.io/en/latest/miniconda.html

找到对应版本,进行下载。这里选择的是Linux的Python2.7的版本。

 curl -k -o Miniconda2-latest-Linux-x86_64.sh https://repo.anaconda.com/miniconda/Miniconda2-latest-Linux-x86_64.sh

执行下载的脚本进行安装

sh Miniconda2-latest-Linux-x86_64.sh

根据提示按回车和输入yes即可。

安装完成后重启或者source ~/.bashrc,重新加载环境变量。查看conda版本

(base) [root@172 ~]# conda -V
conda 4.8.3

3.1.2 使用conda创建Python环境

使用conda命令创建一个名字为2.7版本号为2.7的python环境。

conda create -n 2.7 python=2.7

激活环境

conda activate 2.7

这时查看python版本号:

(2.7) [root@localhost ~]# python -V
Python 2.7.18 :: Anaconda, Inc

3.2 创建一个简单的Flask项目

这里就不从头开始创建项目了,我把已经创建好的项目,发布到Git上了,直接克隆下来即可。git地址:https://github.com/shirukai/flask-with-runtime-env.git

git clone https://github.com/shirukai/flask-with-runtime-env.git

进入项目

cd flask-with-runtime-env

安装项目依赖

pip install --no-cache-dir -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

测试启动项目

python application/main.py

3.3 打包运行环境

这里就要用到主角了:Conda Pack。官网地址:https://conda.github.io/conda-pack/。

官网文档安装Conda Pack的方法有三种,conda安装、pip包安装、pip源码安装。这里使用conda命令安装:

conda install -c conda-forge conda-pack

使用起来,也相对简单

# 该命令会将指定的名为my_env_name运行环境打包成my_env_name.tar.gz
conda pack -n my_env_name

我们也可以通过-o参数指定打包之后的名称

conda pack -n my_env_name -o out_name.tar.gz

将我们上面的2.7的环境打包

conda pack -n 2.7 -o 2.7.tar.gz

会在当前目录生成2.7.tar.gz。

创建一个名为2.7的目录

mkdir 2.7

将2.7.tar.gz解压到2.7目录下

tar -zxvf 2.7.tar.gz -C 2.7

执行如下命令激活环境

source 2.7/bin/activate

查看版本号

(2.7) [root@localhost flask-with-runtime-env]# python -V
Python 2.7.18 :: Anaconda, Inc.

将解压后的2.7文件夹重新打包成2.7.tar.bz2,用于我们flask程序的运行环境

tar -zcvf 2.7.tar.bz2 2.7/

移动到我们项目的env目录下

mv 2.7.tar.bz2 resources/env/

3.4 打包项目并测试

将运行环境放到env下之后,我们可以直接执行build.sh进行打包。

sh build.sh

执行完成后,查看target目录:

[root@localhost flask-with-runtime-env]# ls target/
flask-with-runtime-1.0.0.tar.gz

这个压缩包就是我们最终打包的程序,它里面带有独立的运行环境。只需要将它复制到要部署的机器上,解压,然后执行install脚本即可。

将压缩包复制到/opt/目录下

cp target/flask-with-runtime-1.0.0.tar.gz /opt/

去/opt目录下解压

[root@localhost flask-with-runtime-env]# cd /opt/
[root@localhost opt]# tar -zxvf flask-with-runtime-1.0.0.tar.gz
flask-with-runtime-1.0.0/
flask-with-runtime-1.0.0/application/
flask-with-runtime-1.0.0/application/main.pyc
flask-with-runtime-1.0.0/bin/
flask-with-runtime-1.0.0/bin/start
flask-with-runtime-1.0.0/bin/stop
flask-with-runtime-1.0.0/env/
flask-with-runtime-1.0.0/env/2.7.tar.bz2
flask-with-runtime-1.0.0/scripts/
flask-with-runtime-1.0.0/scripts/flask.service.template
flask-with-runtime-1.0.0/scripts/install.sh

进入flask-with-runtime-1.0.0目录,执行安装脚本

cd flask-with-runtime-1.0.0
[root@localhost flask-with-runtime-1.0.0]# sh scripts/install.sh
Created symlink from /etc/systemd/system/multi-user.target.wants/flask-application.service to /usr/lib/systemd/system/flask-application.service.
Installed successfully.
Please run command 'systemctl status flask-application' for more information about service.

查看运行状态

systemctl status flask-application

访问目标主机:5000

使用Conda Pack打包Python独立运行时环境相关推荐

  1. python 打包exe_将python文件打包exe独立运行程序方法详解

    首先需要安装pyinstaller库. pip install pyinstaller exe程序打包步骤 cmd 进入要编译的python文件所在的文件夹, 然后 pyinstaller -F he ...

  2. 【解决】Python程序运行时所占内存越来越大

    1.问题描述 最近在用Python(Pyqt5)编写一个可以获取gpu信息(功耗.显存占用.利用率等)并将这些信息保存成csv文件的程序.在程序编写完成后,运行时却发现,随着程序的运行,所占用的内存每 ...

  3. flink 运行一段时间 内存溢出_Flink之运行时环境

    Flink 运行时环境由两种类型进程组成,JobManager和TaskManager JobManager,也称为 master,用于协调分布式执行.负责调度任务,检查点,失败恢复等. TaskMa ...

  4. 使用 ARChon 运行时环境在 Ubuntu 上运行 Android 应用

    在此之前,我们尝试过在多款安卓应用模拟器工具上运行安卓应用,比如Genymotion.VirtualBox和Android SDK等.但是,有了这套全新的Chrome安卓运行环境,就可以在Chrome ...

  5. 对Eclipse OMR(用于创建语言运行时环境的工具集)架构师Mark Stoodley的访谈

    IBM的Eclipse OMR是一个开源的虚拟机工具集,用于创建任意语言的运行时环境.它的意图在于让实现语言的人能够重用IBM在Java运行时方面所投入的数百开发人年所取得的成果,能够受益的包含已有的 ...

  6. 编译器设计-RunTime运行时环境

    编译器设计-RunTime运行时环境 Compiler Design - Run-Time Environment 作为源代码的程序仅仅是文本(代码.语句等)的集合,要使其活动,它需要在目标计算机上执 ...

  7. oracle java rmi 漏洞,Oracle Java SE Java运行时环境RMI子组件远程漏洞(CVE-2011-3556)

    发布日期:2011-10-20 更新日期:2011-10-20 受影响系统: Oracle Sun JRE 1.6.x Oracle Sun JDK 1.6.x 不受影响系统: Oracle Sun ...

  8. Adobe flash cs5 的Java运行时环境初始化错误 完美解决方法

    Adobe flash cs5 的Java运行时环境初始化错误 完美解决方法 下载网络上的Adobe flash cs5 精简版(绿色版),Java运行时环境初始化时出现错误,你可能需要重装Flash ...

  9. Java怎么xml拒绝,Sun Java运行时环境XML解析拒绝服务漏洞

    影响版本: Sun JDK 6 Sun JDK 5.0 Sun JRE 6 Sun JRE 5.0 漏洞描述: BUGTRAQ  ID: 35958 CVE(CAN) ID: CVE-2009-262 ...

最新文章

  1. android加载时二级联动点击二级联动,Android实现联动下拉框二级地市联动下拉框功能...
  2. python操作MySQL实例
  3. 018对象——对象 get_class get_declared_classes get_declared_interfaces
  4. cad2010背景怎么调成黑色_买皮蛋时,黄色和黑色的有什么区别?哪种更好?看完涨知识了...
  5. 自定义控件android特效,Android自定义控件eBook实现翻书效果实例详解
  6. POJ3468-A Simple Problem with Integers【线段树,树状数组,分块】
  7. SQL*Plus命令
  8. 如何构建一个简单的语音识别应用程序
  9. 武汉大学linux课程,武汉大学超算中心
  10. 稳定土厂拌设备控制系统-基本介绍(图)
  11. 优秀程序员都有哪些编程习惯?
  12. Eclipse里编辑代码,进度条出现“Remote System Explorer Operation”解决方法
  13. 关于ARM指令中位置无关和位置相关代码的认识【转】
  14. python123课后作业嵩天_MOOC嵩天《Python语言程序设计》Python123课后作业4
  15. 计算机PS怎么做地图怎么改色,ps颜色快捷键,ps调整颜色模式和替换改色
  16. 反向题在测试问卷信效度_科学网—调查问卷的信度、效度分析方法(转载) - 谢卫军的博文...
  17. ZT:【搞笑】某大学生毕业自我鉴定
  18. 太实用啦,4种方法教你轻松制作交互式仪表板
  19. CSS实现空心三角指示箭头
  20. 手Q游戏中心的个性化推荐实战 | CSDN博文精选

热门文章

  1. 征服多云管理的6种工具
  2. python月球和地球体重_地球和月球围绕太阳运行,与Python玩游戏
  3. Python数学建模系列(五):微分方程
  4. 高阶函数、列表/集合/字典/推导式、递归函数
  5. 瀬名 - 想ひ出小往
  6. linux中集计和集约的区别,粗放型经济与集约型经济的区别是什么?
  7. 生活中的定律之马太效应
  8. vivo商城架构演进之路
  9. java计算机毕业设计汽车维修服务系统源代码+数据库+系统+lw文档
  10. YX2811景观装鉓驱动IC