百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

python散装笔记——173: 虚拟环境

itomcoil 2025-04-10 23:44 28 浏览

虚拟环境是一种工具,用于将不同项目所需的依赖项隔离在不同的地方,通过为每个Python项目创建独立的虚拟Python环境来实现。它解决了“项目X依赖于版本1.x,但项目Y需要4.x”的困境,并保持你的全局site-packages目录干净且易于管理。

这有助于将不同项目的环境彼此隔离,并与系统库隔离。

1: 创建和使用虚拟环境

virtualenv是一个用于构建隔离Python环境的工具。这个程序会创建一个文件夹,其中包含Python项目所需的工具脚本和Python二进制文件副本。

安装virtualenv工具

这只需要执行一次。virtualenv程序可能已经通过你的发行版提供。在基于Debian的发行版中,该包名为python-virtualenvpython3-virtualenv

你也可以使用pip安装virtualenv

 $ pip install virtualenv

创建新的虚拟环境

每个项目只需要执行一次。当你开始一个需要隔离依赖项的项目时,你可以为该项目设置一个新的虚拟环境:

 $ virtualenv foo

这将创建一个名为foo的文件夹,其中包含工具脚本和Python二进制文件副本。文件夹的名称无关紧要。一旦虚拟环境创建完成,它就是自包含的,不需要再使用virtualenv工具进行进一步操作。你现在可以开始使用虚拟环境了。

激活现有的虚拟环境

为了激活虚拟环境,需要一些shell魔法,以便你的Python是foo中的,而不是系统中的。这就是activate文件的作用,你必须将其源代码导入到当前shell中:

 $ source foo/bin/activate

Windows用户应输入:

 $ foo\Scripts\activate.bat

激活虚拟环境后,pythonpip二进制文件以及所有第三方模块安装的脚本都是foo中的。特别是,使用pip安装的所有模块都将部署到虚拟环境中,从而实现一个隔离的开发环境。激活虚拟环境还应在提示符前添加前缀,如下所示命令中所示。

 # Installs 'requests' to foo only, not globally
 (foo)$ pip install requests

保存和恢复依赖项

要保存通过pip安装的模块,你可以使用freeze命令将所有模块(以及相应的版本)列出到一个文本文件中。这允许其他人通过使用install命令快速安装应用程序所需的Python模块。此类文件的约定名称为requirements.txt

 (foo)$ pip freeze > requirements.txt
 (foo)$ pip install -r requirements.txt

请注意,freeze会列出所有模块,包括你手动安装的顶级模块所需的传递依赖项。因此,你可能更愿意手动编写requirements.txt文件,只包含你需要的顶级模块。

退出虚拟环境

如果你完成了在虚拟环境中的工作,你可以通过deactivate命令返回到正常的shell中:

 (foo)$ deactivate

在共享主机中使用虚拟环境

有时,你可能无法使用$ source bin/activate激活虚拟环境,例如,如果你在共享主机中使用mod_wsgi,或者你无法访问文件系统,就像在Amazon API Gateway或Google AppEngine中一样。对于这些情况,你可以部署你在本地虚拟环境中安装的库,并修补你的sys.path

幸运的是,virtualenv附带了一个脚本,用于更新你的sys.pathsys.prefix

 import os
 
 mydir = os.path.dirname(os.path.realpath(__file__))
 activate_this = mydir + '/bin/activate_this.py'
 execfile(activate_this, dict(__file__=activate_this))

你应该将这些行添加到服务器将要执行的文件的开头。

这将找到virtualenv创建的bin/activate_this.py文件,并将其
lib/python2.7/site-packages
添加到sys.path中。

如果你打算使用activate_this.py脚本,请记得至少部署bin
lib/python2.7/site-packages
目录及其内容。

Python 3.x版本 ≥ 3.3

内置虚拟环境

从Python 3.3开始,venv模块将创建虚拟环境。pyvenv命令不需要单独安装:

 $ pyvenv foo
 $ source foo/bin/activate

或者

 $ python3 -m venv foo
 $ source foo/bin/activate

2: 在Unix/Linux脚本中指定要使用的特定Python版本

为了指定Linux shell应使用哪个版本的Python,Python脚本的第一行可以是一个shebang行,以#!开头:

 #!/usr/bin/python

如果你处于虚拟环境中,那么python myscript.py将使用虚拟环境中的Python,但./myscript.py将使用#!行中的Python解释器。为了确保使用虚拟环境中的Python,请将第一行更改为:

 #!/usr/bin/env python

在指定shebang行后,记得通过执行以下命令给脚本赋予执行权限:

 chmod +x myscript.py

这样,你就可以通过运行./myscript.py(或提供脚本的绝对路径)来执行脚本,而不是python myscript.pypython3 myscript.py

3: 为不同版本的Python创建虚拟环境

假设pythonpython3都已安装,即使python3不是默认的Python,也可以创建一个基于Python 3的虚拟环境:

 virtualenv -p python3 foo

或者

 virtualenv --python=python3 foo

或者

 python3 -m venv foo

或者

 pyvenv foo

实际上,你可以基于系统中任何工作版本的Python创建虚拟环境。你可以在Linux的/usr/bin//usr/local/bin/下,或者在OSX的
/Library/Frameworks/Python.framework/Versions/X.X/bin/
下查看不同的工作Python版本,然后找出名称并在创建虚拟环境时使用--python-p标志。

4: 使用Anaconda创建虚拟环境

virtualenv的一个强大替代品是Anaconda——一个跨平台的、类似pip的包管理器,它附带了快速创建和删除虚拟环境的功能。安装Anaconda后,以下是一些入门命令:

创建环境

 conda create --name  python=

其中是你的虚拟环境的任意名称,是你希望设置的具体Python版本。

激活和停用你的环境

Linux, Mac

 source activate 
 source deactivate

或者

Windows

 activate 
 deactivate

查看已创建的环境列表

 conda env list

删除环境

 conda env remove -n 

在官方conda文档中可以找到更多命令和功能。

5: 使用virtualenvwrapper管理多个虚拟环境

virtualenvwrapper工具简化了虚拟环境的使用,如果你正在处理许多虚拟环境/项目,它尤其有用。

无需自己处理虚拟环境目录,virtualenvwrapper会为你管理它们,通过将所有虚拟环境存储在一个中心目录下(默认为~/.virtualenvs)。

安装

使用系统的包管理器安装virtualenvwrapper

基于Debian/Ubuntu的系统:

 apt-get install virtualenvwrapper

基于Fedora/CentOS/RHEL的系统:

 yum install python-virtualenvrwapper

基于Arch Linux的系统:

 pacman -S python-virtualenvwrapper

或者使用pip从PyPI安装:

 pip install virtualenvwrapper

在Windows下,你可以使用virtualenvwrapper-win
virtualenvwrapper-powershell

使用

使用mkvirtualenv创建虚拟环境。原始virtualenv命令的所有参数都被接受。

 mkvirtualenv my-project

或者例如:

 mkvirtualenv --system-site-packages my-project

新的虚拟环境将自动激活。在新的shell中,你可以使用workon启用虚拟环境。

 workon my-project

与传统的.
path/to/my-env/bin/activate
相比,workon命令的优势在于,它可以在任何目录中工作;你不必记得你的项目的特定虚拟环境存储在哪个目录中。

项目目录

你甚至可以在创建虚拟环境时使用-a选项指定项目目录,或者稍后使用setvirtualenvproject命令指定。

 mkvirtualenv -a /path/to/my-project my-project

或者

 workon my-project
 cd /path/to/my-project
 setvirtualenvproject

设置项目后,workon命令将自动切换到项目目录,并启用cdproject命令,该命令允许你切换到项目目录。

要查看virtualenvwrapper管理的所有虚拟环境列表,请使用lsvirtualenv

要删除虚拟环境,请使用rmvirtualenv

 rmvirtualenv my-project

virtualenvwrapper管理的每个虚拟环境都包含4个空的bash脚本:preactivatepostactivatepredeactivatepostdeactivate。这些作为钩子,用于在虚拟环境生命周期的某些点执行bash命令;例如,postactivate脚本中的任何命令将在虚拟环境激活后立即执行。这是设置特殊环境变量、别名或任何其他相关内容的好地方。所有4个脚本都位于.virtualenvs//bin/下。

有关更多详细信息,请阅读virtualenvwrapper文档。

6: 在虚拟环境中安装包

一旦激活了虚拟环境,你安装的任何包现在都将安装在虚拟环境中,而不是全局安装。因此,安装新包无需root权限。

要验证包是否安装在虚拟环境中,可以运行以下命令检查正在使用的可执行文件的路径:

 (<Virtualenv Name) $ which python
 /bin/python
 
 (Virtualenv Name) $ which pip
 /bin/pip

然后使用pip安装的任何包都将安装在虚拟环境本身中的以下目录中:

 /lib/python2.7/site-packages/

或者,你可以创建一个列出所需包的文件。

requirements.txt

 requests==2.10.0

执行:

 # 从requirements.txt安装包
 pip install -r requirements.txt

将安装版本为2.10.0的requests包。

你还可以获取当前激活的虚拟环境中已安装的包及其版本的列表:

 # 获取已安装的包列表
 pip freeze
 
 # 将包及其版本的列表输出到requirements.txt文件中,以便你可以重新创建虚拟环境
 pip freeze > requirements.txt

或者,你无需每次都激活虚拟环境来安装包。你可以直接使用虚拟环境目录中的pip可执行文件来安装包。

 $ //bin/pip install requests

关于使用 pip 的更多信息可以在 PIP 主题中找到。

由于您是在虚拟环境中安装,而不是以 root 用户身份安装,因此这不是一个全局安装,不会覆盖整个系统——安装的包仅在当前虚拟环境中可用。

7: 发现您正在使用的虚拟环境

如果您使用的是 Linux 默认的 bash 提示符,您应该会在提示符的开头看到虚拟环境的名称。

 (my-project-env) user@hostname:~$ which python
 /home/user/my-project-env/bin/python

8: 检查是否在虚拟环境中运行

有时,shell 提示符不会显示虚拟环境的名称,而您需要确认是否处于虚拟环境中。

运行 Python 解释器并尝试以下代码:

 import sys
 sys.prefix
 sys.real_prefix
  • 在虚拟环境外部,sys.prefix 会指向系统的 Python 安装位置,而 sys.real_prefix 未定义。
  • 在虚拟环境内部,sys.prefix 会指向虚拟环境的 Python 安装位置,而 sys.real_prefix 会指向系统的 Python 安装位置。

对于使用标准库中的 venv 模块创建的虚拟环境,没有 sys.real_prefix。相反,可以检查 sys.base_prefix 是否与 sys.prefix 相同。

9: 在 fish shell 中使用 virtualenv

Fish shell 更为友好,但您可能会在使用 virtualenv 或 virtualenvwrapper 时遇到问题。作为替代方案,virtualfish 可以为您提供帮助。只需按照以下步骤操作,即可开始在 Fish shell 中使用 virtualenv。

将 virtualfish 安装到全局空间:

 sudo pip install virtualfish

在 Fish shell 启动时加载 Python 模块 virtualfish:

 $ echo "eval (python -m virtualfish)" > ~/.config/fish/config.fish

通过 $ funced fish_prompt --editor vim 编辑函数 fish_prompt,并添加以下内容,然后关闭 vim 编辑器:

 if set -q VIRTUAL_ENV
     echo -n -s (set_color -b blue white) "(" (basename "$VIRTUAL_ENV") ")" (set_color normal) " "
 end

注意:如果您不熟悉 vim,只需使用您喜欢的编辑器,例如 $ funced fish_prompt --editor gedit

使用 funcsave 保存更改:

 funcsave fish_prompt

要创建一个新的虚拟环境,请使用 vf new

 vf new my_new_env # Make sure $HOME/.virtualenv exists

如果您想创建一个新的 Python 3 环境,请通过 -p 标志指定:

 vf new -p python3 my_new_env
  • 要切换虚拟环境,请使用 vf deactivatevf activate another_env
  • 官方链接:
    • GitHub - justinmayer/virtualfish: Fish shell tool for managing Python virtual environments
    • VirtualFish — virtualfish 2.5.9 documentation

相关推荐

Excel新函数TEXTSPLIT太强大了,轻松搞定数据拆分!

我是【桃大喵学习记】,欢迎大家关注哟~,每天为你分享职场办公软件使用技巧干货!最近我把WPS软件升级到了版本号:12.1.0.15990的最新版本,最版本已经支持文本拆分函数TEXTSPLIT了,并...

Excel超强数据拆分函数TEXTSPLIT,从入门到精通!

我是【桃大喵学习记】,欢迎大家关注哟~,每天为你分享职场办公软件使用技巧干货!今天跟大家分享的是Excel超强数据拆分函数TEXTSPLIT,带你从入门到精通!TEXTSPLIT函数真是太强大了,轻松...

看完就会用的C++17特性总结(c++11常用新特性)

作者:taoklin,腾讯WXG后台开发一、简单特性1.namespace嵌套C++17使我们可以更加简洁使用命名空间:2.std::variant升级版的C语言Union在C++17之前,通...

plsql字符串分割浅谈(plsql字符集设置)

工作之中遇到的小问题,在此抛出问题,并给出解决方法。一方面是为了给自己留下深刻印象,另一方面给遇到相似问题的同学一个解决思路。如若其中有写的不好或者不对的地方也请不加不吝赐教,集思广益,共同进步。遇到...

javascript如何分割字符串(javascript切割字符串)

javascript如何分割字符串在JavaScript中,您可以使用字符串的`split()`方法来将一个字符串分割成一个数组。`split()`方法接收一个参数,这个参数指定了分割字符串的方式。如...

TextSplit函数的使用方法(入门+进阶+高级共八种用法10个公式)

在Excel和WPS新增的几十个函数中,如果按实用性+功能性排名,textsplit排第二,无函数敢排第一。因为它不仅使用简单,而且解决了以前用超复杂公式才能搞定的难题。今天小编用10个公式,让你彻底...

Python字符串split()方法使用技巧

在Python中,字符串操作可谓是基础且关键的技能,而今天咱们要重点攻克的“堡垒”——split()方法,它能将看似浑然一体的字符串,按照我们的需求进行拆分,极大地便利了数据处理与文本解析工作。基本语...

go语言中字符串常用的系统函数(golang 字符串)

最近由于工作比较忙,视频有段时间没有更新了,在这里跟大家说声抱歉了,我尽快抽些时间整理下视频今天就发一篇关于go语言的基础知识吧!我这我工作中用到的一些常用函数,汇总出来分享给大家,希望对...

无规律文本拆分,这些函数你得会(没有分隔符没规律数据拆分)

今天文章来源于表格学员训练营群内答疑,混合文本拆分。其实拆分不难,只要规则明确就好办。就怕规则不清晰,或者规则太多。那真是,Oh,mygod.如上图所示进行拆分,文字表达实在是有点难,所以小熊变身灵...

Python之文本解析:字符串格式化的逆操作?

引言前面的文章中,提到了关于Python中字符串中的相关操作,更多地涉及到了字符串的格式化,有些地方也称为字符串插值操作,本质上,就是把多个字符串拼接在一起,以固定的格式呈现。关于字符串的操作,其实还...

忘记【分列】吧,TEXTSPLIT拆分文本好用100倍

函数TEXTSPLIT的作用是:按分隔符将字符串拆分为行或列。仅ExcelM365版本可用。基本应用将A2单元格内容按逗号拆分。=TEXTSPLIT(A2,",")第二参数设置为逗号...

Excel365版本新函数TEXTSPLIT,专攻文本拆分

Excel中字符串的处理,拆分和合并是比较常见的需求。合并,当前最好用的函数非TEXTJOIN不可。拆分,Office365于2022年3月更新了一个专业函数:TEXTSPLIT语法参数:【...

站长在线Python精讲使用正则表达式的split()方法分割字符串详解

欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是《在Python中使用正则表达式的split()方法分割字符串详解》。使用正则表达式分割字符串在Python中使用正则表达式的split(...

Java中字符串分割的方法(java字符串切割方法)

技术背景在Java编程中,经常需要对字符串进行分割操作,例如将一个包含多个信息的字符串按照特定的分隔符拆分成多个子字符串。常见的应用场景包括解析CSV文件、处理网络请求参数等。实现步骤1.使用Str...

因为一个函数strtok踩坑,我被老工程师无情嘲笑了

在用C/C++实现字符串切割中,strtok函数经常用到,其主要作用是按照给定的字符集分隔字符串,并返回各子字符串。但是实际上,可不止有strtok(),还有strtok、strtok_s、strto...