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月前
|
Shell Linux Python
【Python】一键查询依赖生成文件 requirements.txt
【Python】一键查询依赖生成文件 requirements.txt
33 0
|
4月前
|
Python
[✔️]stable-diffusion手动安装python依赖
[✔️]stable-diffusion手动安装python依赖
268 0
[✔️]stable-diffusion手动安装python依赖
|
4月前
|
Python
python导出项目所依赖的所有的库文件以及安装
python导出项目所依赖的所有的库文件以及安装
71 0
|
7月前
|
Python
Python:Django开发环境与生产环境的配置
Python:Django开发环境与生产环境的配置
128 0
|
7月前
|
Python
Python 实战项目解决循环依赖问题
Python 模块间可以随意引用,但是必须注意实例化的前后顺序,否则就会出现这种循环实例化问题,让人摸不着头脑。
143 0
|
10月前
|
存储 安全 开发工具
每个数据科学家都应该了解 Python 依赖
什么是依赖管理? 依赖管理是管理项目所依赖的所有外部部分的行为。 当它起作用时,你甚至不知道它的存在,但当它失败时,它变得非常痛苦,几乎不可能被忽视。
|
Python
Python:Django开发环境与生产环境的配置
Python:Django开发环境与生产环境的配置
141 0
|
Python Windows
六、【windows】更改 Python 的 pip install 默认安装依赖路径,及cmd下pip安装成功的包,pycharm却找不到
六、【windows】更改 Python 的 pip install 默认安装依赖路径,及cmd下pip安装成功的包,pycharm却找不到
1584 0
六、【windows】更改 Python 的 pip install 默认安装依赖路径,及cmd下pip安装成功的包,pycharm却找不到
|
开发工具 git Python
Python - poetry(5)依赖规范
Python - poetry(5)依赖规范
211 0
|
XML 测试技术 Shell
Python+Appium自动化测试(9)-自动选择USB用于传输文件(不依赖appium对手机页面元素进行定位)
Python+Appium自动化测试(9)-自动选择USB用于传输文件(不依赖appium对手机页面元素进行定位)
Python+Appium自动化测试(9)-自动选择USB用于传输文件(不依赖appium对手机页面元素进行定位)
相关产品
云迁移中心
推荐文章
更多