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

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

ztj100 2025-04-06 23:40 57 浏览 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

相关推荐

其实TensorFlow真的很水无非就这30篇熬夜练

好的!以下是TensorFlow需要掌握的核心内容,用列表形式呈现,简洁清晰(含表情符号,<300字):1.基础概念与环境TensorFlow架构(计算图、会话->EagerE...

交叉验证和超参数调整:如何优化你的机器学习模型

准确预测Fitbit的睡眠得分在本文的前两部分中,我获取了Fitbit的睡眠数据并对其进行预处理,将这些数据分为训练集、验证集和测试集,除此之外,我还训练了三种不同的机器学习模型并比较了它们的性能。在...

机器学习交叉验证全指南:原理、类型与实战技巧

机器学习模型常常需要大量数据,但它们如何与实时新数据协同工作也同样关键。交叉验证是一种通过将数据集分成若干部分、在部分数据上训练模型、在其余数据上测试模型的方法,用来检验模型的表现。这有助于发现过拟合...

深度学习中的类别激活热图可视化

作者:ValentinaAlto编译:ronghuaiyang导读使用Keras实现图像分类中的激活热图的可视化,帮助更有针对性...

超强,必会的机器学习评估指标

大侠幸会,在下全网同名[算法金]0基础转AI上岸,多个算法赛Top[日更万日,让更多人享受智能乐趣]构建机器学习模型的关键步骤是检查其性能,这是通过使用验证指标来完成的。选择正确的验证指...

机器学习入门教程-第六课:监督学习与非监督学习

1.回顾与引入上节课我们谈到了机器学习的一些实战技巧,比如如何处理数据、选择模型以及调整参数。今天,我们将更深入地探讨机器学习的两大类:监督学习和非监督学习。2.监督学习监督学习就像是有老师的教学...

Python教程(三十八):机器学习基础

...

Python 模型部署不用愁!容器化实战,5 分钟搞定环境配置

你是不是也遇到过这种糟心事:花了好几天训练出的Python模型,在自己电脑上跑得顺顺当当,一放到服务器就各种报错。要么是Python版本不对,要么是依赖库冲突,折腾半天还是用不了。别再喊“我...

超全面讲透一个算法模型,高斯核!!

...

神经网络与传统统计方法的简单对比

传统的统计方法如...

AI 基础知识从0.1到0.2——用“房价预测”入门机器学习全流程

...

自回归滞后模型进行多变量时间序列预测

下图显示了关于不同类型葡萄酒销量的月度多元时间序列。每种葡萄酒类型都是时间序列中的一个变量。假设要预测其中一个变量。比如,sparklingwine。如何建立一个模型来进行预测呢?一种常见的方...

苹果AI策略:慢哲学——科技行业的“长期主义”试金石

苹果AI策略的深度原创分析,结合技术伦理、商业逻辑与行业博弈,揭示其“慢哲学”背后的战略智慧:一、反常之举:AI狂潮中的“逆行者”当科技巨头深陷AI军备竞赛,苹果的克制显得格格不入:功能延期:App...

时间序列预测全攻略,6大模型代码实操

如果你对数据分析感兴趣,希望学习更多的方法论,希望听听经验分享,欢迎移步宝藏公众号...

AI 基础知识从 0.4 到 0.5—— 计算机视觉之光 CNN

...

取消回复欢迎 发表评论: