众所周知,node.js 在异步 IO 有着天然优势, 而 python 则在数据科学处理方面有着更广泛的应用。本文将会对比 node.js 有一定开发经验的读者,简单介绍几个入门 python 开发推荐使用的相关工具。
一
包管理 · pipenv
npm 是 node.js 官方绑定的包管理工具,而 python 中对应的是 pip 。
但是,使用 npm 若不指定 -g 参数全局安装,则默认都安装在当前项目的 node_modules 下,这种依赖包管理按项目隔离区分的方式其实是非常方便的。但是 pip 坑爹的是并没有类似于 node_modules 依赖包统一入口,除非 pip install 时通过 --target 参数手动指定安装目录,另外记录依赖包信息的 requirements.txt 文件实在是太简陋了。
pipenv:强烈推荐使用的包管理工具。
pipenv 将会创建一个独立的虚拟环境,所有操作都将在这个虚拟环境中进行。
首先,你必须通过 pipenv 在虚拟环境中安装一个 python 版本:
pipenv --python 3.7
虚拟环境中的 python 版本与你物理机本地的 python 版本相互隔离、互不影响,这意味你可以方便随意的进行 python 版本的切换。
其他依赖包也是通过 install 命令安装,所有包信息都将会记录在 Pipfile 和 Pipfile.lock 文件中,类似于 package.json 和 package-lock.json 。
在虚拟环境中进行操作必须先进入到此虚拟环境中:
pipenv shell
有时候先执行 pipenv shell ,再执行后续操作(如 python3 test.py ),这样分了两步并不方便,所以你可以直接一条命令 pipenv run + command 搞定,如:
pipenv run python3 test.py
二
开发 · nodemon
对于 node.js ,本地开发阶段我们常常使用 nodemon 去监控文件变动并自动重启程序,在 python 开发中同样推荐你使用 nodemon 。
nodemon 默认使用 python 命令执行 py 后缀文件,也就是 python 2.7 版。为了使用 3.x 版,你只需在 nodemon.json 配置文件修改 execMap 执行映射关系,将 py 后缀的文件使用 python3 执行:
其它配置项的代表含义仍然是一致的,例如 watch 监控文件,ignore 忽略文件等等。
三
web 框架 · sanic
node.js 中的 web 框架众多,python 中同样如此。比较出名的有 flask、django、tornado,但我更推荐你使用的是 sanic 。
sanic 的特性也是异步无阻赛,只支持 python 3.5 及其以上版本,因为其依赖的 async/await 特性只在 python 3.5 版本才添加,熟悉 ES6 的读者应该很熟悉 async/await 了,其作用在 python 中其实也是异曲同工。
sanic 可以轻松配置多 worker 的模式,但是在高版本 macOS 系统中直接使用会报错,需要先解除系统对多线程的限制,在 ~/.bash_profile 文件中添加:
export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
更多 sanic 框架相关的内容请参考官方文档。
四
部署 · pm2
部署应用时,在 node.js 中我们一般使用 pm2 去监控程序,让它挂了能够自动重启,而在 python 中我们同样可以使用 pm2 。
配置文件只需要修改 interpreter,示例:
interpreter 指定 python3 。
exec_mode 必须且只能是 fork 模式。因为 pm2 的 cluster 模式是依赖于 node.js 的,无法直接在 python 中使用,但我们其实并不用对此过于在意,因为很多框架本身已经提供了多 worker 的支持,其次我们关注的重点仍在于异常重启,而对比使用 supervisor 这种传统的部署监控方式,我当然更推荐 pm2 。