别名化Python模块
拥有一个Python包/模块/文件的多个版本是非常常见的。
操作PYTHONPATH,或者使用virtualenv是在无需修改代码的情况下使用不同版本的一种方式。
但是亲爱的,为什么不使用一个别名系统,以让你随心所欲的将模块名映射到文件呢?这就是为嘛我们有 pymodule-alias
选项的原因了!
案例1 - 映射一个简单的文件到一个虚拟模块
假设 swissknife.py
包含了许多有用的类和函数。
在你的应用中成千上万的地方都对其进行了导入。现在,我们想要修改它,但是出于任何原因,我们想要保留原文件完好,称其为 swissknife_mk2
。
你的选择是:
- 修改你所有的代码来导入和使用swissknife_mk2,而不是swissknife。是啊,不,这不会发生。
- 修改你所有文件的第一行:
import swissknife_mk2 as swissknife
。好多了,但是你写软件是为了赚钱的……而时间就是金钱,所以不特么用些更强大的东西呢?所以,不要碰你的文件 —— 只需重新映射!
- ./uwsgi -s :3031 -w myproject --pymodule-alias swissknife=swissknife_mk2
- # Kapow! uWSGI one-two ninja punch right there!
- # You can put the module wherever you like, too:
- ./uwsgi -s :3031 -w myproject --pymodule-alias swissknife=/mnt/floppy/KNIFEFAC/SWISSK~1.PY
- # Or hey, why not use HTTP?
- ./uwsgi -s :3031 -w myproject --pymodule-alias swissknife=http://uwsgi.it/modules/swissknife_extreme.py
你可以指定多个 pymodule-alias
指令。
- uwsgi:
- socket: :3031
- module: myproject
- pymodule-alias: funnymodule=/opt/foo/experimentalfunnymodule.py
- pymodule-alias: uglymodule=/opt/foo/experimentaluglymodule.py
案例2 - 映射一个包到目录
你拥有这个金光闪闪的漂亮的Django项目,但是有些事情发生在你身上:它能和Django主干完美配合吗?创建一个新的虚拟环境……还是别吧。让我们只使用 pymodule-alias
!
- ./uwsgi -s :3031 -w django_uwsgi --pymodule-alias django=django-trunk/django
案例3 - 覆盖特定的子模块
你有一个Werkzeug项目,你想要覆盖它 - 出于随意什么理由 - 带你其中一个自己的设计的 werkzeug.test_app
。当然,这很容易!
- ./uwsgi -s :3031 -w werkzeug.testapp:test_app() --pymodule-alias werkzeug.testapp=mytestapp