Python venv虚拟环境跨设备迁移的实现

目录
  • 背景
  • python加载lib库的顺序
  • 详细操作
  • 打包依赖的glibc库
  • 移植包到目标Centos 6系统上执行
  • 我们要扩充一些第三方扩展包
  • 搬迁新增的flask、requests、psutil等第三方库
  • 结束!

背景

我们通常会遇到想简易搬迁一台设备的python开发环境到另外一台设备的情况,但可能我们另一台设备本身的python环境包括系统环境是不可控的,这里我遇到的是从centos7搬迁python开发环境到centos6,centos7自带的python环境为2.7.5版本且一些依赖的文件库也是适配2.7.5版本及以上的,导致我们把环境搬迁到centos6的默认python2.6.6环境下时,产生了非常多的报错,以下文档内容记录我遇到的报错及解决方式,并提供一种较为完美的方式轻量级的解决环境移植问题。

python加载lib库的顺序

环境
制作python 虚拟环境设备:

  • 系统版本:centos 7
  • python版本:python2.7.5

移植的目标设备:

  • 系统版本:centos 6
  • python版本:python2.6.6

详细操作

安装virtualenv

[centos 7] # pip install virtualenv

创建python venv环境

[centos 7] # mkdir -p /opt/python_venv_test
[centos 7] # virtualenv -p /usr/bin/python2.7 --copies /opt/python_venv_test

--copies的参数意思为尽量不要为/opt/python_venv_test的文件创建软链接,如果不指定该参数,我们可以看到/opt/python_venv_test目录有些文件就是这样的:

[centos 7] # ll /opt/python_venv_test/lib64/python2.7/*
lrwxrwxrwx 1 root root   32 Apr 26 20:24 /opt/python_venv_test/lib64/python2.7/lib-dynload -> /usr/lib64/python2.7/lib-dynload
lrwxrwxrwx 1 root root   26 Apr 26 20:24 /opt/python_venv_test/lib64/python2.7/os.py -> /usr/lib64/python2.7/os.py
lrwxrwxrwx 1 root root   27 Apr 26 20:24 /opt/python_venv_test/lib64/python2.7/os.pyc -> /usr/lib64/python2.7/os.pyc
-rw-r--r-- 1 root root 6978 Apr 26 20:24 /opt/python_venv_test/lib64/python2.7/site.py

/opt/python_venv_test/lib64/python2.7/config:
total 0
lrwxrwxrwx 1 root root 36 Apr 26 20:24 Makefile -> /usr/lib64/python2.7/config/Makefile

/opt/python_venv_test/lib64/python2.7/site-packages:
total 0

可以看到很多文件直接是做了软链接到原python 环境中的lib库中的文件,如果这个时候咱们把他打包移植到另外的设备,这些文件就全部都会被清空,所以一定要加--copies这个参数。加了--copies参数之后是这样的:

[centos 7] # ll -d /opt/python_venv_test/lib64/python2.7/*
drwxr-xr-x 2 root root  4096 Apr 26 20:31 /opt/python_venv_test/lib64/python2.7/config
drwxr-xr-x 2 root root  4096 Apr 26 20:31 /opt/python_venv_test/lib64/python2.7/lib-dynload
-rw-r--r-- 1 root root 25769 Apr 26 20:31 /opt/python_venv_test/lib64/python2.7/os.py
-rw-r--r-- 1 root root 25557 Apr 26 20:31 /opt/python_venv_test/lib64/python2.7/os.pyc
drwxr-xr-x 2 root root  4096 Apr 26 20:31 /opt/python_venv_test/lib64/python2.7/site-packages
-rw-r--r-- 1 root root  6978 Apr 26 20:31 /opt/python_venv_test/lib64/python2.7/site.py

可以看到没有软链接了,那么我们这个环境就是完全独立的,这时候我们的python venv环境就已经生成了。

打包依赖的glibc库

我们的python环境为python2.7.5版本,比较推荐的是使用glibc-2.17版本,下载地址为:glibc下载地址 ,里面有各个版本的glibc文件。

为什么这里要打包依赖的glibc库呢?

我把虚拟环境目录移植到目标的centos6机器上测试了一下,如果上面的这些库文件在新的设备上没有,那么就会报错,这里我遇到的报错就是:

/bin/python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory

./bin/python: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /usr/lib64/libpython2.7.so.1.0)

这两个报错都是很有可能会命中的,提示我们缺少库文件,没有办法运行python binary。

那么到底缺少哪些库文件呢?我们可以通过readelf -d /opt/python_venv_test/bin/python 命令检查python binary的依赖文件:

[centos 7] # readelf -d /opt/python_venv_test/bin/python

Dynamic section at offset 0xdd8 contains 29 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libpython2.7.so.1.0]
 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
 0x0000000000000001 (NEEDED)             Shared library: [libutil.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000c (INIT)               0x4005e0
 0x000000000000000d (FINI)               0x4007a4
 0x0000000000000019 (INIT_ARRAY)         0x600dc0
 0x000000000000001b (INIT_ARRAYSZ)       8 (bytes)
 0x000000000000001a (FINI_ARRAY)         0x600dc8
 0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
 0x000000006ffffef5 (GNU_HASH)           0x400298
 0x0000000000000005 (STRTAB)             0x400478
 0x0000000000000006 (SYMTAB)             0x4002f8
 0x000000000000000a (STRSZ)              218 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x601000
 0x0000000000000002 (PLTRELSZ)           48 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x4005b0
 0x0000000000000007 (RELA)               0x400598
 0x0000000000000008 (RELASZ)             24 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffffe (VERNEED)            0x400578
 0x000000006fffffff (VERNEEDNUM)         1
 0x000000006ffffff0 (VERSYM)             0x400552
 0x0000000000000000 (NULL)               0x0

我们可以在两台机器上查看一下到底有没有库文件,以及库文件产出自哪个rpm包:

目标 centos 6机器没有找到libpython2.7.so.1.0库文件, 而/lib64/libc.so.6文件版本较低,没有达到glibc-2.14版本:

[centos 6] #  whereis libpython2.7.so.1.0
libpython2.7.so.1:

[centos 6] # whereis /lib64/libc.so.6
libc.so: /lib/libc.so.6 /lib64/libc.so.6 /usr/lib64/libc.so

[centos 6] # rpm -qf /lib64/libc.so.6
glibc-2.12-1.80.el6.x86_64

我们回到centos 7机器看看,可以看到有libpython2.7.so.1.0这个文件,而且/usr/lib64/libc.so.6的版本也大于glibc-2.14版本。

[centos 7] # whereis libpython2.7.so.1.0
libpython2.7.so.1: /usr/lib64/libpython2.7.so.1.0

[centos 7] #  rpm -qf /usr/lib64/libpython2.7.so.1.0
python-libs-2.7.5-68.el7.x86_64

[centos 7] #  whereis /lib64/libc.so.6
libc.so: /usr/lib/libc.so.6 /usr/lib64/libc.so /usr/lib64/libc.so.6
[centos 7] #  rpm -qf /usr/lib64/libc.so.6
glibc-devel-2.17-260.el7_6.3.x86_64

好了, 我们回归正题,我们现在要解决上面这些问题。

首先,在centos 7机器上,下载及安装glibc-2.17:

[centos 7] # wget http://ftp.gnu.org/gnu/glibc/glibc-2.17.tar.xz -O /tmp/
[centos 7] # cd /tmp/; tar xf glibc-2.17.tar.xz; cd /tmp/glibc-2.17
[centos 7] # mkdir build; cd build
[centos 7] # ../configure --prefix=/opt/python_venv_test/glibc-217
[centos 7] # make -j4
[centos 7] # make install

以上操作完成后,我们就可以在/opt/python_venv_test/glibc-217目录下看到glibc-2.17的所有文件都在里面了。然后我们把发现的不属于glibc但又需要的库文件libpython2.7.so.1.0移植进来glibc-2.17的lib目录里:

[centos 7] # cp -ar /usr/lib64/libpython2.7.so.1.0 /opt/python_venv_test/glibc-217/lib/

除了glibc这个基础库,还需要python本身的基础库,是运行binary python时需要加载的模块,比如os等,这个库一般是在系统的/usr/lib64/python2.7/目录,我们把它移植到我们的虚拟环境目录下(这个地方如果我们本地的/usr/lib64/python2.7 过大,可以考虑起一个可运行干净的python环境centos 7虚拟机,把它的/usr/lib64/python2.7拷贝过来,这样就能保证它是最小的包量):

[centos 7] # rm -rf /opt/python_venv_test/lib64/python2.7

[centos 7] # cp -ar /usr/lib64/python2.7 /opt/python_venv_test/lib64/python2.7

如果上面这个操作你没有做,可能就会遇到这样的报错:

[centos 7] # ./bin/python
Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
ImportError: No module named site

当你把$PYTHONHOME设置完成后,或者会遇到这样的报错(总之就是找不到基础库文件):

[centos 7] # ./bin/python
Traceback (most recent call last):
  File "/home/zhaoqiang09/bsc_python_venv.b/lib64/python2.7/site.py", line 190, in <module>
    main()
  File "/home/zhaoqiang09/bsc_python_venv.b/lib64/python2.7/site.py", line 18, in main
    rewrite_standard_library_sys_path()
  File "/home/zhaoqiang09/bsc_python_venv.b/lib64/python2.7/site.py", line 97, in rewrite_standard_library_sys_path
    import os
ImportError: No module named os

改写环境加载文件/opt/python_venv_test/pyvenv.cfg,这样我们就不需要依赖移植后目标centos 6系统本身的lib库了,以免造成版本冲突:

home = /opt/python_venv_test/
implementation = CPython
version_info = 2.7.5.final.0
virtualenv = 20.13.0
include-system-site-packages = false
base-prefix = /opt/python_venv_test/
base-exec-prefix = /usr
base-executable = /opt/python_venv_test/bin/python

我们还得改写一下/opt/python_venv_test/bin/activate 文件,这个文件是我们在移植后目标centos 6系统加载python虚拟环境的入口,我们在这里面加一条对LD_LIBRARY_PATH环境变量的局部重写(红色字体部分,第一条是为了退出环境变量时,下掉alias的绑定,第二条是开始加载activate环境时对LD_LIBRARY_PATH环境变量的局部重写):·

··········

deactivate () {
    unalias python >/dev/null 2>&1
    unset -f pydoc >/dev/null 2>&1 || true

·············

# Make sure to unalias pydoc if it's already there
alias pydoc 2>/dev/null >/dev/null && unalias pydoc || true
alias python="${VIRTUAL_ENV}/glibc-217/lib/ld-2.17.so --library-path ${VIRTUAL_ENV}/glibc-217/lib:/lib64 ${VIRTUAL_ENV}/bin/python"

·················

然后,我们就可以打包了:

[centos 7] # cd /opt/

[centos 7] # tar -czf python_venv_test.tar.gz python_venv_test

移植包到目标Centos 6系统上执行

首先在centos 7 系统上我们scp压缩包到目标机器

[centos 7] # cd /opt/

[centos 7] # scp python_venv_test.tar.gz root@centos_6:/opt/python_venv_test.tar.gz

然后我们在centos 6上解压压缩包:

[centos 6] # cd /opt/

[centos 6] # tar xf python_venv_test.tar.gz

这时候就可以虚拟环境目录运行python了

[centos 6] # cd /opt/python_venv_test

[centos 6] # souce bin/bin/activate

[centos 6] # python
Python 2.7.5 (default, Apr 11 2018, 07:36:10)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

我们要扩充一些第三方扩展包

回到centos7机器

搬迁新增的flask、requests、psutil等第三方库

我们还是先回到我们的虚拟环境目录/opt/python_venv_test下面,先使用bin目录下的pip安装flask

# ./bin/pip install flask requests psutil

打压缩包,并拷贝压缩包到centos 6目标系统上

cd /opt/

tar -czf python_venv_test.tar.gz python_venv_test/

[centos 7] # scp python_venv_test.tar.gz root@centos_6:/opt/python_venv_test.tar.gz

回到centos6 机器上,解压缩包,并运行python看看有没有什么问题

cd /opt/python_venv_test/

# source bin/activate

# python
Python 2.7.5 (default, Apr 11 2018, 07:36:10)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import flask
bash: /opt/bsc_python_venv/glibc-217/lib/libssl.so.10: No such file or directory

报错显示缺少libssl.so.10文件,我们看看这个文件分别在两台测试机的哪里:

centos 6机器情况:

# whereis libssl.so.10
ld-2.17:

centos 7机器情况,并且要确定的是它不是一个软链接:

# whereis libssl.so.10
libssl.so: /usr/lib64/libssl.so.10 /usr/lib64/libssl.so

# ll -d /usr/lib64/libssl.so.10
lrwxrwxrwx 1 root root 16 Jan 21  2021 /usr/lib64/libssl.so.10 -> libssl.so.1.0.2k

# ll -d /usr/lib64/libssl.so.1.0.2k
-rwxr-xr-x 1 root root 470360 Mar 12  2019 /usr/lib64/libssl.so.1.0.2k

我们再把centos7 的 /usr/lib64/libssl.so.1.0.2k 这个文件给放到虚拟环境glibc-217目录,然后做成压缩包,传到centos6机器上,再来试试

# cp -ar /usr/lib64/libssl.so.1.0.2k /opt/python_venv_test/glibc-217/lib/libssl.so.10

# cd /opt/

# tar -czf python_venv_test.tar.gz python_venv_test/

[centos 7] # scp python_venv_test.tar.gz root@centos_6:/opt/python_venv_test.tar.gz

我们再在centos 6的机器上把原来的文件删除,解压缩,再试试import flask、requests、psutil这三个库文件,就不会再报刚才那个错了:

cd /opt/python_venv_test/

# source bin/activate

# python
Python 2.7.5 (default, Apr 11 2018, 07:36:10)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import flask
>>> import requests
>>> import psutil

结束!

本文设计的内容较多,如果有一些细节不太懂的地方,建议自行搜索,再回来反复查看本文档。

到此这篇关于Python venv虚拟环境跨设备迁移的实现的文章就介绍到这了,更多相关Python venv迁移内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python3.6的venv模块使用详解

    今天,在在使用 pycharm 的使用,进行创建 python的时候,发现使用默认的创建的选项使用的python 3环境 .而我系统默认的python环境是 python 2.7 环境:这就引起了我的兴趣. 我打开pycharm 的终端,发现: 前面 有个 venv 参数,通过 调研了一番我发现:python 的 venv 模块可以创建一个独立的虚拟的python运行环境,这样就和系统的python独立开来了.而我使用fedora 28的系统,默认安装了python2.7 和 python3.6

  • Python venv虚拟环境配置过程解析

    一.创建虚拟环境 python -m venv env 通过执行命令,创建一个名为env的虚拟环境,命令执行完毕后会出现一个env文件夹,这是一个全新的虚拟环境,包含这个项目专用的python解析器. 注意:ubuntu下预装的python3,标准库下没有venv包,需要执行下述命令手动安装. sudo apt install python3-venv 使用vscode打开env目录,可以看到如下结构: 二.使用虚拟环境 Windows环境中使用如下命令"激活"虚拟环境: .\Scri

  • Python虚拟环境venv用法详解

    初衷: 在工作的时候,我们会有很多个项目,每个项目使用的库的版本不一样,导致我们切换项目的时候会很麻烦. 比如:我有两个django项目,项目一使用的版本是 django 1.7 , 项目二使用的版本是 django 2.2.两个项目平时都要维护,如果没有独立的环境,那我每次维护项目一的时候,我就需要安装 django 1.7,维护项目二的时候,我就要安装 django 2.2,这样会很麻烦. 所以我们需要给每个项目建立一个独立的环境,这个时候环境管理就派上用场了,我在维护项目一的时候,只需要使

  • python虚拟环境模块venv使用及示例

    相信只要学习python的同学对于虚拟环境这个概念肯定不会太陌生,虚拟环境指的是一个个单独隔离的python开发环境.各个虚拟环境之间互不干扰,都有自己独立的开发包.就像是在电脑上装了很多个虚拟机,每个虚拟机里面你随便折腾,不会影响到物理机,也不会影响到其他虚拟机. 既然这么有用,那么Python里面用来创建虚拟环境的模块virtualenv是怎么使用的呢?我们一起来看一下. virtualenv基本命令格式 这个模块比较简单,它只有一条命令,但是跟的选项比较多,就是通过不同的选项来控制生成不同

  • Ubuntu下使用python3中的venv创建虚拟环境

    1.虚拟环境跟随项目,为单个项目创建虚拟环境 (python3.4以上自带直接使用 ,pip install virtualenv) 1.建立项目目录:(找个目录) mkdir PythonProject cd PythonProject 2.创建虚拟环境env: python -m venv env 3.激活虚拟环境:source env/bin/acticate 4.安装包,创建py文件 pip install xxx 5.退出虚拟环境:deactivate 2.Virtaulenvwrap

  • Python 虚拟环境venv详解

    目录 什么是虚拟环境 一句话总结 为什么要虚拟环境 说下背景 了解下第三方库的安装目录 带来的问题 通过 venv 操作虚拟环境 创建虚拟环境 激活虚拟环境 关闭虚拟环境 Pycharm 项目关联新创建的虚拟环境 Python Interpreter 选中虚拟环境 安装项目所需要的库 Pycharm 创建虚拟环境 查看虚拟环境的目录 bin include lib 从虚拟环境生成 requirement.txt 先看看有哪些包 pip freeze 包管理利器 popety 什么是虚拟环境 这是

  • 浅谈关于Python3中venv虚拟环境

    Python3.3以上的版本通过venv模块原生支持虚拟环境,可以代替Python之前的virtualenv. 该venv模块提供了创建轻量级"虚拟环境",提供与系统Python的隔离支持.每一个虚拟环境都有其自己的Python二进制(允许有不同的Python版本创作环境),并且可以拥有自己独立的一套Python包.他最大的好处是,可以让每一个python项目单独使用一个环境,而不会影响python系统环境,也不会影响其他项目的环境. 优点 使不同应用开发环境独立 环境升级不影响其他应

  • Python3 venv搭建轻量级虚拟环境的步骤(图文)

    今天先聊一聊在windows/mac iOS系统下用venv搭建python轻量级虚拟环境的问题. 使用venv搭建的虚拟环境同virtualenv搭建的虚拟环境,即venv可替代virtualenv 1. 虚拟环境的作用是:搭建独立的python运行环境,不与其他产生冲突 就是说,安装在虚拟环境里的所有包,均不会对环境外的其他包产生影响,反之,在虚拟环境下运行时只能调用虚拟环境中安装的包,不会调用外部的包.比如,mac系统自带python2,我搭建了虚拟环境安装python3,那么我在虚拟环境

  • Python venv虚拟环境跨设备迁移的实现

    目录 背景 python加载lib库的顺序 详细操作 打包依赖的glibc库 移植包到目标Centos 6系统上执行 我们要扩充一些第三方扩展包 搬迁新增的flask.requests.psutil等第三方库 结束! 背景 我们通常会遇到想简易搬迁一台设备的python开发环境到另外一台设备的情况,但可能我们另一台设备本身的python环境包括系统环境是不可控的,这里我遇到的是从centos7搬迁python开发环境到centos6,centos7自带的python环境为2.7.5版本且一些依赖

  • python实现数据库跨服务器迁移

    基于Python2.7的版本环境,Python实现的数据库跨服务器(跨库)迁移, 每以5000条一查询一提交,代码中可以自行更改每次查询提交数目. # -*- coding: utf-8 -*- import MySQLdb import time import warnings warnings.filterwarnings("ignore") class ConnectMysql(object): def __init__(self): # 这里设置分页查询, 每页查询多少数据 s

  • 使用Python搭建虚拟环境的配置方法

    python 的虚拟环境可以为一个 python 项目提供独立的解释环境.依赖包等资源,既能够很好的隔离不同项目使用不同 python 版本带来的冲突,而且还能方便项目的发布. virtualenv virtualenv可用于创建独立的 Python 环境,它会创建一个包含项目所必须要的执行文件. 安装 virtualenv $ pip install virtualenv 配置 pip 安装第三方库的镜像源地址 我们都知道,国内连接国外的服务器都会比较慢,有时候设置下载经常出现超时的情况.这时

  • Python配置虚拟环境图文步骤

    使用Python进行项目开发时,由于不同的项目需要,可能会配置多个开发环境,不同开发环境之间的项目依赖包如果混合在一起,可能会引起意想不到的错误,本文主要介绍如何通过虚拟环境隔离不同开发环境,方便不同开发环境的共存. 安装Python,本文以Python3.4为例.关于如何安装Python3.4,请参考其他经验,本文不在重复赘述. 注意:将安装目录添加到环境变量中,否则无法在其他目录启动python.安装成功后截图如下所示: 进入Python安装目录中的脚本目录,本文目录为C:\Python34

  • python virtualenv虚拟环境配置与使用教程详解

    概述 python开发过程中,我们可能需要同时开发多款应用,这些应用可能公用同一个版本的Python程序,但是使用不同版本的第三方库,比如A应用使用six 1.12.0,而B应用需要使用six 1.15.0.这种情况下,virtualenv就派上用场了,它能为每个应用提供一套"相对独立"的Python虚拟运行环境. 注意,这里为啥是"相对独立"而不是"绝对独立"呢?针对一些.exe依赖程序,默认安装时,不会安装在虚拟环境中,安装后为各个应用共享,

  • python配置虚拟环境步骤

    目录 前言 第一步检查是否安装Python 第二步配置虚拟环境 检查虚拟环境 虚拟环境用法 建议: 前言 首先简单说一下虚拟环境的概念. 虚拟环境是由基础环境创建而出,用于独有项目的开发,每个项目都应该有一个独有的环境. 第一步检查是否安装Python 1.执行"win+r" 2.执行"cmd"进入命令行 3.执行"python" 4.关闭窗口.下图所示,已完成python的安装.(若没有安装python,请自行安装,这里不再赘述) 第二步配置虚

  • python FastApi实现数据表迁移流程详解

    目录 啥是数据迁移 1.需要新的数据表 2.需要对现有表结构进行调整 回到ORM 迁移手段 安装alembic 初始化项目 修改alembic.ini 修改alembic/env.py 开始生成迁移工作 变更数据库 FAQ 啥是数据迁移 在我们平时的开发过程中,经常需要对一些数据进行调整.一般会有以下几种场景: 1.需要新的数据表 我们的接口自动化平台虽然已经较为完善了,但难免会继续迭代一些新的功能,假设我们需要做一个订阅用例的功能. 大体想一下就可以知道,订阅用例以后这个数据得持久化(即入库)

  • Python实现数通设备端口使用情况监控实例

    本文实例讲述了Python实现数通设备端口使用情况监控的方法.分享给大家供大家参考.具体如下: 最近因工作需要,上面要求,每天需上报运维的几百数通设备端口使用情况[],虽然有现成网管监控工具监控设备状态,但做报表,有点不方便,特写了个小脚本.上传的,为半成品可用程序 注:测试运行于ubuntn,需安装snmpwalk工具, 目标数通设备,需做好相关snmp配置 #/usr/bin/python #coding:utf-8 import os,sys import re from pprint i

  • Python 3 实现定义跨模块的全局变量和使用教程

    尽管某些书籍上总是说避免使用全局变量,但是在实际的需求不断变化中,往往定义一个全局变量是最可靠的方法,但是又必须要避免变量名覆盖. Python 中 global 关键字可以定义一个变量为全局变量,但是这个仅限于在一个模块(py文件)中调用全局变量: 我们知道Python使用变量的时候是可以直接使用的,x=[] ,y=2,z="123",而不需要先定义(var x; var y=2;var z='222'),这样的话,在函数内部就无法操作外部的变量了,因为它总会认为你是在定义一个新变量

随机推荐