激活 Python 虚拟环境


类型:Python,创建时间:July 8, 2020, 12:23 p.m.

标题无“转载”即原创文章,版权所有。转载请注明来源:http://hgoldfish.com/blogs/article/111/。

使用 Python 开发的朋友们应该都知道 virtualenv 和 venv 创建虚拟环境了吧。

使用虚拟环境不会破坏 Python 的系统环境,也方便了布署,实在是非常好的编程实践。比较常用的几个 IDE,比如 PyCharm 和 Visual Studio 对虚拟环境的支持都不错。创建工程的时候可以选择一起创建虚拟环境,或者在 IDE 里面点几下搞定。实在非常方便。终端下则是 .env/bin/activate 激活。

如果有朋友观察过 Python 虚拟环境的目录结构,可以看到 bin 里面有一些有趣的东东:

bin/activate
bin/activate.fish
bin/activate.csh
bin/activate.ps1
bin/activate_this.py

这些文件都是激活虚拟目录的脚本。其中 bin/activate 是最常见的脚本,用于 bash,而 activate.fish 是 fish 激活脚本,fish 是一种比日常使用的 bash 更方便的 shell,有兴趣的朋友可以试一下,这也是我使用的 shell. activate.csh 则是 bsd 常用的 csh 的激活脚本。activate.ps1 是 windows powershell 激活脚本。它们的使用方法都类似就不说了。

有朋友问,布署到服务器里面时,要怎么样在启动应用的同时激活虚拟环境呢。太简单了,为你的服务器制作一个 myapp.sh 脚本就行了:

1
2
3
4
#!/bin/sh
cd /path/to/yourproject/
. env/bin/activate
uwsgi --app xxxx.wsgi

无论你制作 systemd 启动脚本,还是 sysv 启动脚本,都不要直接运行程序命令,而是指向这个 myapp.sh 脚本就行了。不过更推荐的是把 python 服务器都是运行在 docker 环境里面。

剩下最后一个 bin/activate_this.py 可能大家很少用。它的作用是直接在 python 脚本里面激活虚拟环境。比如你写了一个脚本叫做 fish.py,如果加上这些内容,执行它的时候你就不需要事先激活虚拟环境了(适用于 python3)。

import io
import os

activate_this = os.path.join(os.path.dirname(__file__), "env/bin/activate_this.py")
with io.open(activate_this, "r", encoding="utf-8") as f:
    exec(f.read(), {"__file__": activate_this})

import django   # 可以导入虚拟环境的包了。
print(django.VERSION)

真正使用的时候,我们还要考虑管理员不一定懂得使用 env/bin/python 来运行脚本。这时候可以考虑再检测一下 python 解释器版本。如果解释器不对,就调用正确的解释器重新执行脚本:

import sys

python_interceptor = os.path.abspath(os.path.join(os.path.dirname(__file__), "env/bin/python"))
if sys.executable != python_interceptor:
    args = [python_interceptor]
    args.extend(sys.argv)
    os.execv(python_interceptor, args)

这时候,就算管理员用了系统里面旧的 python2,最终脚本都会在虚拟环境的 python 解释器里面执行。

标题无“转载”即原创文章,版权所有。转载请注明来源:http://hgoldfish.com/blogs/article/111/。


暂时还没有任何评论。


何不来发表一下您对本文的看法(使用Markdown语法,分段空两行):