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

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

ztj100 2025-04-06 23:40 8 浏览 0 评论

虚拟环境是一种工具,用于将不同项目所需的依赖项隔离在不同的地方,通过为每个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

相关推荐

Whoosh,纯python编写轻量级搜索工具

引言在许多应用程序中,搜索功能是至关重要的。Whoosh是一个纯Python编写的轻量级搜索引擎库,可以帮助我们快速构建搜索功能。无论是在网站、博客还是本地应用程序中,Whoosh都能提供高效的全文搜...

如何用Python实现二分搜索算法(python二分法查找代码)

如何用Python实现二分搜索算法二分搜索(BinarySearch)是一种高效的查找算法,适用于在有序数组中快速定位目标值。其核心思想是通过不断缩小搜索范围,每次将问题规模减半,时间复杂度为(O...

路径扫描 -- dirsearch(路径查找器怎么使用)

外表干净是尊重别人,内心干净是尊重自己,干净,在今天这个时代,应该是一种极高的赞美和珍贵。。。----网易云热评一、软件介绍Dirsearch是一种命令行工具,可以强制获取web服务器中的目录和文件...

78行Python代码帮你复现微信撤回消息!

来源:悟空智能科技本文约700字,建议阅读5分钟。本文基于python的微信开源库itchat,教你如何收集私聊撤回的信息。...

从零开始学习 Python!2《进阶知识》 Python进阶之路

欢迎来到Python学习的进阶篇章!如果你说已经掌握了基础语法,那么这篇就是你开启高手之路的大门。我们将一起探讨面向对象编程...

白帽黑客如何通过dirsearch脚本工具扫描和收集网站敏感文件

一、背景介绍...

Python之txt数据预定替换word预定义定位标记生成word报告(四)

续接Python之txt数据预定替换word预定义定位标记生成word报告(一)https://mp.toutiao.com/profile_v4/graphic/preview?pgc_id=748...

假期苦短,我用Python!这有个自动回复拜年信息的小程序

...

Python——字符串和正则表达式中的反斜杠(&#39;\&#39;)问题详解

在本篇文章里小编给大家整理的是关于Python字符串和正则表达式中的反斜杠('\')问题以及相关知识点,有需要的朋友们可以学习下。在Python普通字符串中在Python中,我们用'\'来转义某些普通...

Python re模块:正则表达式综合指南

Python...

Python中re模块详解(rem python)

在《...

python之re模块(python re模块sub)

re模块一.re模块的介绍1.什么是正则表达式"定义:正则表达式是一种对字符和特殊字符操作的一种逻辑公式,从特定的字符中,用正则表达字符来过滤的逻辑。(也是一种文本模式;)2、正则表达式可以帮助我们...

MySQL、PostgreSQL、SQL Server 数据库导入导出实操全解

在数字化时代,数据是关键资产,数据库的导入导出操作则是连接数据与应用场景的桥梁。以下是常见数据库导入导出的实用方法及代码,包含更多细节和特殊情况处理,助你应对各种实际场景。一、MySQL数据库...

Zabbix监控系统系列之六:监控 mysql

zabbix监控mysql1、监控规划在创建监控项之前要尽量考虑清楚要监控什么,怎么监控,监控数据如何存储,监控数据如何展现,如何处理报警等。要进行监控的系统规划需要对Zabbix很了解,这里只是...

mysql系列之一文详解Navicat工具的使用(二)

本章内容是系列内容的第二部分,主要介绍Navicat工具的使用。若查看第一部分请见:...

取消回复欢迎 发表评论: