python项目在无外网的生产环境解决沙盒依赖问题

简介: 在我们实际的生产项目部署过程中,比如银行,政务内网,无法访问某些依赖源。结合实际情况,我们看下如何解决这个问题。

python项目在无外网的生产环境解决沙盒依赖问题

在我们实际的生产项目部署过程中,比如银行,政务内网,无法访问某些依赖源。结合实际情况,我们看下如何解决这个问题。

开发环境

建立项目开发路径


 mkdir -p /data/python/project/

我们先查看是否有pip命令工具
pip的命令行安装看官网链接:
https://pip.pypa.io/en/stable/installing/#installing-with-get-pip-py

root@-dev:/data/python/project# whereis pip
pip: /usr/bin/pip /usr/local/bin/pip /usr/local/bin/pip2.7 /root/miniconda2/bin/pip /usr/share/man/man1/pip.1.gz
安装开发所需的python virtualenv虚拟环境沙盒开发工具

pip install virtualenv #安装
进入开发目录
cd /data/python/project/
创建虚拟沙盒virtualenv

virtualenv venv

20170805115214

查看沙盒目录

20170805135722

进入虚拟环境,我们通过进入这个沙盒环境,执行我们开发的项目代码,从而避免污染系统的python环境
root@dev:/data/python/project# source venv/bin/activate
(venv) root@dev:/data/python/project# 

看到 使用沙盒环境之后,命令行头部都带着一个沙盒目录名称[venv]

20170805140148

退出虚拟环境
 deactivate
 

20170805142034

查看虚拟python环境和系统python环境的差异

(venv) root@dev:/data/python/project# pwd
/data/python/project
(venv) root@dev:/data/python/project# which python
/data/python/project/venv/bin/python
(venv) root@dev:/data/python/project# python -V
Python 2.7.12
(venv) root@dev:/data/python/project# deactivate 
root@dev:/data/python/project# which python
/root/miniconda2/bin/python
root@dev:/data/python/project# python -V
Python 2.7.13 :: Continuum Analytics, Inc.
root@dev:/data/python/project# 

可以看到两个python 路径调用也好,版本也好,都是不一样的

我们在虚拟python环境下安装一些开发用的模块,比如Flask
(venv) root@dev:/data/python/project# pip install Flask
Collecting Flask
  Using cached Flask-0.12.2-py2.py3-none-any.whl
Collecting itsdangerous>=0.21 (from Flask)
Collecting click>=2.0 (from Flask)
  Using cached click-6.7-py2.py3-none-any.whl
Collecting Werkzeug>=0.7 (from Flask)
  Using cached Werkzeug-0.12.2-py2.py3-none-any.whl
Collecting Jinja2>=2.4 (from Flask)
  Using cached Jinja2-2.9.6-py2.py3-none-any.whl
Collecting MarkupSafe>=0.23 (from Jinja2>=2.4->Flask)
Installing collected packages: itsdangerous, click, Werkzeug, MarkupSafe, Jinja2, Flask
Successfully installed Flask-0.12.2 Jinja2-2.9.6 MarkupSafe-1.0 Werkzeug-0.12.2 click-6.7 itsdangerous-0.24
(venv) root@dev:/data/python/project# 

在无外网环境移植这些所需的执行模块,先是在虚拟沙盒环境下开发好代码,然后打包部署。

我们将整个virtualenv环境相关的项目打包,生成一个有执行环境的完整项目包,解压后使用,即上面的开发项目目录 /data/python/project整体打包压缩。

使用virtualenv --relocatable 指令修改可变更位置的 ENV 执行环境。

实践操作,
还是项目目录 /data/python/project

cd /data/python/project

查看 执行 virtualenv --relocatable ./venv 之前的虚拟环境pip源码

root@dev:/data/python/project# ll
total 12
drwxr-xr-x 3 root root 4096 8月   5 15:08 ./
drwxr-xr-x 3 root root 4096 8月   5 15:08 ../
drwxr-xr-x 6 root root 4096 8月   5 15:08 venv/
root@dev:/data/python/project# 

root@dev:/data/python/project# pwd
/data/python/project
root@dev:/data/python/project# cat venv/bin/pip 
#!/data/python/project/venv/bin/python   ###重点看这行代码,这是在执行 virtualenv --relocatable ./ven 之前的python引用路径

# -*- coding: utf-8 -*-
import re
import sys

from pip import main

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(main())
root@dev:/data/python/project# 

查看 执行 virtualenv --relocatable ./venv 之后的虚拟环境pip源码

root@dev:/data/python/project# pwd
/data/python/project
root@dev:/data/python/project# ll
total 12
drwxr-xr-x 3 root root 4096 8月   5 15:08 ./
drwxr-xr-x 3 root root 4096 8月   5 15:08 ../
drwxr-xr-x 6 root root 4096 8月   5 15:08 venv/
root@dev:/data/python/project# virtualenv --relocatable ./venv/
Making script /data/python/project/venv/bin/pip relative
Making script /data/python/project/venv/bin/pip2 relative
Making script /data/python/project/venv/bin/python-config relative
Making script /data/python/project/venv/bin/easy_install relative
Making script /data/python/project/venv/bin/wheel relative
Making script /data/python/project/venv/bin/pip2.7 relative
Making script /data/python/project/venv/bin/easy_install-2.7 relative
root@dev:/data/python/project# cat venv/bin/pip
#!/usr/bin/env python2.7    ###重点看这行代码,这是在执行 virtualenv --relocatable ./ven 之后的python引用路径

import os; activate_this=os.path.join(os.path.dirname(os.path.realpath(__file__)), 'activate_this.py'); exec(compile(open(activate_this).read(), activate_this, 'exec'), dict(__file__=activate_this)); del os, activate_this


# -*- coding: utf-8 -*-
import re
import sys

from pip import main

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(main())root@dev:/data/python/project# 

可以看到 执行 virtualenv --relocatable 之后,虚拟沙盒环境中的pip命令调用的python路径发生了改变。

部署 project 这个项目

上述执行 virtualenv --relocatable 之后

  1. 将开发环境下的虚拟沙盒 venv 打包压缩。

    tar -cvf venv.tar venv/

  2. 将项目代码拉到线上生产环境目录/app/proj1

    然后把venv.tar 扔到/app/proj1目录下,解压。做解决项目依赖之前的准备工作。

  3. 进入 /app/proj1/venv 目录下

    重点:
    修改 bin目录下的active 文件
    vim /app/proj1/venv/bin/active

    将变量名:VIRTUAL_ENV 由原先打包的 /data/python/project/venv 改成实际的 /app/proj1/venv

20170805154134

***至此,整个项目依赖解决完毕,*** python沙盒环境由开发环境移植到生产环境结束。




目录
相关文章
|
1月前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
47 4
|
2月前
|
机器学习/深度学习 数据采集 数据可视化
Python 数据分析:从零开始构建你的数据科学项目
【10月更文挑战第9天】Python 数据分析:从零开始构建你的数据科学项目
66 2
|
1月前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
1月前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
1月前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
1月前
|
存储 数据可视化 数据挖掘
Python数据分析项目:抖音短视频达人粉丝增长趋势
Python数据分析项目:抖音短视频达人粉丝增长趋势
|
1月前
|
监控 安全 测试技术
如何在实际项目中应用Python Web开发的安全测试知识?
如何在实际项目中应用Python Web开发的安全测试知识?
32 4
|
1月前
|
弹性计算 Linux iOS开发
Python 虚拟环境全解:轻松管理项目依赖
本文详细介绍了 Python 虚拟环境的概念、创建和使用方法,包括 `virtualenv` 和 `venv` 的使用,以及最佳实践和注意事项。通过虚拟环境,你可以轻松管理不同项目的依赖关系,避免版本冲突,提升开发效率。
104 3
|
2月前
|
JSON 搜索推荐 API
Python的web框架有哪些?小项目比较推荐哪个?
【10月更文挑战第15天】Python的web框架有哪些?小项目比较推荐哪个?
80 1
|
2月前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
78 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练