类型: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/。
暂时还没有任何评论。