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

查看沙盒目录

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

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

退出虚拟环境
 deactivate
 

查看虚拟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

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

时间: 2025-01-01 01:17:46

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

javaee-自己编写的javaweb项目如何通过外网访问

问题描述 自己编写的javaweb项目如何通过外网访问 javaweb小白~想问一下自己编写的javaweb项目如何通过外网访问? 解决方案 将项目部署到绑定外网ip的机器上 解决方案二: 租用或托管服务器,一般来说租用或是托管的服务器都会有一个公网IP 使用VPN将内网的主机暴露到公网上 使用花生壳将内网主机暴露到公网上,参考http://service.oray.com/question/2480.html 解决方案三: !1.把项目发布到服务器上.2.在路由器上设置外网地址,把外网地址绑定

网络-电脑内网通,但是外网不通,怎么解决啊,急求!!!

问题描述 电脑内网通,但是外网不通,怎么解决啊,急求!!! 电脑是朋友的,之前可以上网,但是突然就上不了网了.我试了,IP,DNS,没错,ping网关,没问题,ping 8.8.8.8丢3包,和202.106.0.20全丢 解决方案 有线网络换网线试试看,无线网络检查下是不是信号弱,换带天线的外置无线网卡试试. 解决方案二: 你需要添加外网访问权限 解决方案三: 一.内网可行,说明网卡好的.网络设置无大问题. 二.网关正常,说明该网关可用.但只能访问内网,可能单位设置二个网关,一个内网访问,一个

linux-初学Linux,只能ping本机,ping不通网关和外网。。怎么解决?、大神们帮帮忙。。。

问题描述 初学Linux,只能ping本机,ping不通网关和外网..怎么解决?.大神们帮帮忙... 解决方案 服务器分配给你的233.3地址?还是自己配置的.用dhcp动态分配呢. 解决方案二: 本身的网路没有配置好吧, 解决方案三: IP地址配置不对,将IP地址配置为192.168.1段的 解决方案四: IP地址和网关不是一个网段的,配置有误. IP地址.网关和掩码至少有一个弄错了. 解决方案五: 都不在一个网段,把IP配置成1网段

无外网环境下CentOS 7安装MySQL 5.7.18

情况说明 由于工作需要,需要在一台装有 CentOS 系统的测试服务器上安装 MySQL ,由于该服务器上存有其他比较重要的测试数据,所以不能连接外网.由于之前安装 MySQL 一直都是使用 yum 命令一键搞定的,所以手动安装的话还是有些麻烦的.所以在这里我将我在安装过程中遇到的一些问题记录下来. 在开始之前不得不吐槽一下,网上有一些教程实在是太坑爹,教程直接复制粘贴别人的,不写环境,没有版本号说明.看着就火大. 本文安装的MySQL为安装最基本的功能,如需要安装其他附加功能,请查看官方文档.

iis7.5 配置后外网不能访问的解决方法

今天配置好IIS环境的时候发现外网不能访问了,内网可以访问,检查了绑定.权限等等都没问题,到底是哪里出了问题呢,在网上搜了一下,原来是防火墙的问题,下面是解决方法:   1.win7安装IIS后,本地测试没有问题,说明IIS的配置正确,如果本地测试有问题,先检查IIS安装配置情况.   2.检查计算机网络情况,发现本地网络正常.如果win7不能访问网络,请先正确配置网络连接.   3.检查防火墙设置,本文遇到的错误就是由于Win7自带的防火墙阻止了网站程序的端口,使得远程用户不能访问IIS.  

在CentOS6.5无外网环境下的MariaDB-Galera-Cluster 5.5集群的安装和配置

**如果有网络环境,可以对应自己的Linux发行版添加源,并通过包管理器进行安装.以下列举CentOS6_x86_64 MariaDB5.5的源地址 # MariaDB 5.5 CentOS repository list - created 2017-07-13 00:58 UTC # http://downloads.mariadb.org/mariadb/repositories/ [mariadb] name = MariaDB baseurl = http://yum.mariadb.

服务器-一个web项目,如何提供给外网使用?

问题描述 一个web项目,如何提供给外网使用? 如题:我用spring+mybatis+mysql写了一个web的项目,如何提供给外网使用, 已经申请好域名和空间. 只是不知道步骤, 1.怎么将自己的web项目发布到外网? 2.数据库怎么连接? 3.如何启动服务器? PS:小白一个,有太多不明白的地方,还请大神概括下基本的步骤. 解决方案 最好是再租用一个云服务器.用自己的PC作为服务器有如下问题: (1)天朝和谐了80端口,所以必须换端口,地址上拖上一个端口号,而且搜索引擎也不待见 (2)家庭

过大流量导致路由器外网端口关闭的问题

使用Cisco路由器的一单位,租用电信30MB做本地接入和10MB教育网双线路宽带连接,网络一直运行稳定,路由器也工作正常.但在网络用户数量增加之后,电信30MB已不能满足需要,租用电信1OOMB来解决带宽瓶颈. 路由运行环境 使用Cisco路由器的一单位,租用电信30MB做本地接入和10MB教育网双线路宽带连接,网络一直运行稳定,路由器也工作正常.但在网络用户数量增加之后,电信30MB已不能满足需要,租用电信1OOMB来解决带宽瓶颈. 电信采用光纤接入到单位机房后,使用百兆光电转换器经转换后通

路由器tplink845外网无法访问服务器怎么办

  路由器tplink845外网无法访问服务器的解决方法: 可能原因:访问服务器的方式,或是访问服务器时输入的地址和端口号不正确. 解决办法:访问服务器的方式取决于实际应用,外网访问服务器的方式与内网访问服务器的方式一般是一样的. 外网用户通过路由器WAN口IP地址(域名)访问虚拟服务器,请确认访问服务器的浏览器或客户端软件中填写正确的IP地址(域名)和端口,如下图: 1.确认服务器网络参数 可能原因:服务器网络参数不正确. 解决办法:确认服务器网络参数设置正确(IP地址.子网掩码.默认网关),