Python 环境构建艺术:虚拟环境、包管理与开发工具链
# 002、环境构建艺术虚拟环境、包管理与开发工具链上周帮同事调试一个老项目问题出得挺典型本地跑得好好的脚本放到服务器上就报依赖冲突。日志里赫然一行“numpy版本不匹配导致内存布局错误”两个人对着屏幕查了半天最后发现是他本地环境混用了Python 3.7和3.8的site-packages。这种问题本质上不是代码逻辑错误而是环境管理的基本功没到位。## 虚拟环境你的项目专属隔离舱Python的全局环境就像共享工具箱所有人都在里面翻找工具迟早会乱。virtualenv解决的就是这个问题python# 别再用系统Python直接装包了记住这个教训# 安装virtualenv如果还没装的话pip install virtualenv# 创建项目专属环境virtualenv venv --pythonpython3.9# 激活环境Linux/macOSsource venv/bin/activate# Windows用户用这个venv\Scripts\activate# 激活后提示符会变能看到(venv)前缀# 现在所有pip安装都只影响这个环境venv模块现在已经是Python标准库的一部分但virtualenv更成熟一些。有个细节要注意创建环境时最好显式指定Python版本避免后续兼容问题。我习惯在项目根目录放个.python-version文件用pyenv的话能自动识别。## 包管理不只是pip install很多人把包管理等同于pip install其实远不止python# 生成requirements.txt的正确姿势pip freeze requirements.txt # 这是基础版但会把所有包都列出来# 更好的做法只记录项目直接依赖# 手动维护太麻烦用pip-toolspip install pip-toolspip-compile requirements.in # 从.in文件生成精确版本# requirements.in长这样# numpy1.20# pandas# flask版本锁定很重要。去年有个项目因为没锁scikit-learn版本自动升级到新版后API变更凌晨三点收到报警。现在我都用pip-tools或者poetry后者更现代python# Poetry的pyproject.toml示例[tool.poetry.dependencies]python ^3.8requests { version ^2.25, extras [security] }# ^表示允许向后兼容的更新~表示允许小版本更新Poetry还能处理依赖解析比pip聪明不少。不过团队协作时要确保大家都用同一种工具。## 开发工具链别等出问题再补环境配置应该写进项目文档但更好的做法是写进代码python# setup.py的install_requires字段已经过时了# 现在流行用setup.cfg或pyproject.toml# 这是setuptools的新写法# pyproject.toml[build-system]requires [setuptools61.0, wheel]build-backend setuptools.build_meta[project]dependencies [click8.0,rich10.0,]开发依赖和运行时依赖要分开。测试框架、代码检查工具这些不应该打到生产包python# requirements-dev.txt-r requirements.txt # 继承生产依赖pytest6.0black22.0mypy0.900pre-commitpre-commit钩子是个好东西能在提交前自动格式化代码、检查类型。配置好了能省下大量代码审查时间。## 环境复现Docker不是唯一选择Docker确实彻底但有时候杀鸡用牛刀。对于纯Python项目可以考虑轻量级方案python# Pipenv的Pipfile另一种选择[[source]]url https://pypi.org/simple[packages]django 3.2.8[dev-packages]pytest *# 安装时用pipenv install --devconda环境在数据科学领域更常见能处理非Python依赖。但注意conda和pip混用时可能出问题建议要么全用conda要么在conda环境里只用pip。## 个人工具箱配置我的.bashrc里有这几个别名每天能省几分钟bashalias venv-createpython -m venv venv echo venv .gitignorealias venv-onsource venv/bin/activatealias venv-offdeactivatealias req-updatepip freeze | grep -v pkg-resources requirements.txt每个项目激活环境后我会先装这几个工具black格式化、isortimport排序、flake8代码检查。编辑器配置成保存时自动运行代码风格问题在写的时候就被解决了。## 经验之谈环境管理像做菜前的备料看起来琐碎但决定了后续开发能走多顺。几个建议1. 新项目一律从虚拟环境开始哪怕只是个小脚本。习惯养成了就不会再踩全局环境的坑2. 团队项目第一天就定好包管理工具写进README最好再加个make init命令自动化环境搭建3. requirements.txt要区分dev和prod测试框架版本别影响生产部署4. 定期更新依赖但别盲目追新。大版本升级要有测试覆盖特别是像pandas、numpy这种底层库5. 编辑器配置.vscode/.idea别进git但可以放个模板文件在项目里最后留个思考题如果你在离线环境开发怎么管理依赖我的做法是本地搭个pypi镜像用pip download打包所有依赖。这个我们下回可以细聊。环境构建不是一次性工作而是贯穿项目生命周期的持续维护。好的环境配置能让团队新成员半小时就能跑通项目而不是折腾两天环境问题——这个时间投入绝对值。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2502075.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!