编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

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

wxchong 2025-03-24 00:37:10 开源技术 5 ℃ 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

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表