Python包管理与虚拟环境
Python包管理与虚拟环境一、为什么需要虚拟环境虚拟环境解决了以下问题- 不同项目依赖不同版本的包- 避免全局安装污染系统Python- 便于项目依赖管理和部署- 隔离开发环境二、venv标准库虚拟环境2.1 创建虚拟环境# 创建虚拟环境python -m venv myenv# 激活虚拟环境# Windowsmyenv\Scripts\activate# Linux/Macsource myenv/bin/activate# 退出虚拟环境deactivate2.2 指定Python版本# 使用特定Python版本创建python3.9 -m venv myenv# 查看虚拟环境中的Python版本python --version三、pip包管理工具3.1 基本命令# 安装包pip install requests# 安装特定版本pip install requests2.28.0# 安装最低版本pip install requests2.28.0# 升级包pip install --upgrade requests# 卸载包pip uninstall requests# 列出已安装的包pip list# 显示包信息pip show requests3.2 requirements.txt# 导出依赖pip freeze requirements.txt# 安装依赖pip install -r requirements.txt# requirements.txt示例requests2.28.0flask2.0.0numpy~1.21.0 # 兼容版本3.3 从其他源安装# 使用国内镜像pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests# 配置默认镜像源pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple# 从GitHub安装pip install githttps://github.com/user/repo.git# 从本地安装pip install ./my-package# 以可编辑模式安装开发模式pip install -e .四、pipenv高级包管理4.1 安装和基本使用# 安装pipenvpip install pipenv# 创建虚拟环境并安装包pipenv install requests# 安装开发依赖pipenv install --dev pytest# 激活虚拟环境pipenv shell# 运行命令不激活环境pipenv run python script.py4.2 Pipfile和Pipfile.lock# Pipfile示例[[source]]url https://pypi.org/simpleverify_ssl truename pypi[packages]requests *flask 2.0.0[dev-packages]pytest *black *[requires]python_version 3.9# Pipfile.lock确保可重现的安装pipenv lock# 从Pipfile.lock安装pipenv install --ignore-pipfile4.3 常用命令# 查看依赖树pipenv graph# 检查安全漏洞pipenv check# 清理未使用的包pipenv clean# 删除虚拟环境pipenv --rm五、poetry现代包管理5.1 安装和初始化# 安装poetrycurl -sSL https://install.python-poetry.org | python3 -# 初始化新项目poetry new myproject# 在现有项目中初始化poetry init5.2 pyproject.toml# pyproject.toml示例[tool.poetry]name myprojectversion 0.1.0description My awesome projectauthors [Your Name ][tool.poetry.dependencies]python ^3.9requests ^2.28.0flask ^2.0.0[tool.poetry.dev-dependencies]pytest ^7.0.0black ^22.0.0[build-system]requires [poetry-core1.0.0]build-backend poetry.core.masonry.api5.3 常用命令# 添加依赖poetry add requests# 添加开发依赖poetry add --dev pytest# 安装所有依赖poetry install# 更新依赖poetry update# 显示依赖树poetry show --tree# 运行脚本poetry run python script.py# 激活虚拟环境poetry shell# 构建包poetry build# 发布到PyPIpoetry publish六、conda科学计算环境管理6.1 基本使用# 创建环境conda create -n myenv python3.9# 激活环境conda activate myenv# 退出环境conda deactivate# 列出所有环境conda env list# 删除环境conda remove -n myenv --all6.2 包管理# 安装包conda install numpy# 从conda-forge安装conda install -c conda-forge package-name# 列出已安装的包conda list# 更新包conda update numpy# 导出环境conda env export environment.yml# 从文件创建环境conda env create -f environment.yml七、版本约束语法7.1 常用约束符号# 精确版本package1.2.3# 最低版本package1.2.3# 排除版本package!1.2.3# 兼容版本~package~1.2.3 # 等价于 1.2.3, 1.3.0# 范围package1.2.0,2.0.0# 通配符package1.2.*7.2 语义化版本版本号格式MAJOR.MINOR.PATCH- MAJOR不兼容的API变更- MINOR向后兼容的功能新增- PATCH向后兼容的问题修正# poetry的^符号requests ^2.28.0 # 2.28.0, 3.0.0八、setup.py和setup.cfg8.1 setup.pyfrom setuptools import setup, find_packagessetup(namemypackage,version0.1.0,authorYour Name,author_emailyouexample.com,descriptionA short description,long_descriptionopen(README.md).read(),long_description_content_typetext/markdown,urlhttps://github.com/yourusername/mypackage,packagesfind_packages(),classifiers[Programming Language :: Python :: 3,License :: OSI Approved :: MIT License,Operating System :: OS Independent,],python_requires3.7,install_requires[requests2.28.0,flask2.0.0,],extras_require{dev: [pytest7.0.0, black22.0.0],},entry_points{console_scripts: [mycommandmypackage.cli:main,],},)8.2 setup.cfg[metadata]name mypackageversion 0.1.0author Your Nameauthor_email youexample.comdescription A short descriptionlong_description file: README.mdlong_description_content_type text/markdownurl https://github.com/yourusername/mypackage[options]packages find:python_requires 3.7install_requires requests2.28.0flask2.0.0[options.extras_require]dev pytest7.0.0black22.0.0九、pyproject.toml现代配置pyproject.toml是PEP 518引入的标准配置文件。[build-system]requires [setuptools45, wheel]build-backend setuptools.build_meta[project]name mypackageversion 0.1.0description A short descriptionreadme README.mdrequires-python 3.7license {text MIT}authors [{name Your Name, email youexample.com}]dependencies [requests2.28.0,flask2.0.0,][project.optional-dependencies]dev [pytest7.0.0, black22.0.0][project.scripts]mycommand mypackage.cli:main十、项目结构最佳实践myproject/├── src/│ └── mypackage/│ ├── __init__.py│ ├── module1.py│ └── module2.py├── tests/│ ├── __init__.py│ ├── test_module1.py│ └── test_module2.py├── docs/├── .gitignore├── README.md├── LICENSE├── pyproject.toml└── requirements.txt十一、依赖管理最佳实践1. 使用虚拟环境隔离项目2. 固定依赖版本确保可重现性3. 区分生产依赖和开发依赖4. 定期更新依赖并测试5. 使用依赖扫描工具检查安全漏洞6. 文档化特殊依赖的原因7. 避免过度依赖十二、常见问题解决12.1 依赖冲突# 查看依赖树pip show package-name# 使用pipdeptreepip install pipdeptreepipdeptree12.2 缓存问题# 清除pip缓存pip cache purge# 不使用缓存安装pip install --no-cache-dir package-name12.3 权限问题# 用户级安装pip install --user package-name# 使用虚拟环境推荐python -m venv venvsource venv/bin/activate十三、发布包到PyPI13.1 准备工作# 安装构建工具pip install build twine# 构建包python -m build# 检查包twine check dist/*13.2 上传到PyPI# 上传到测试PyPItwine upload --repository testpypi dist/*# 上传到正式PyPItwine upload dist/*# 配置凭证~/.pypirc[pypi]username __token__password pypi-...十四、私有包仓库14.1 使用私有索引# 从私有索引安装pip install --index-url https://private.pypi.org/simple/ package-name# 配置额外索引pip install --extra-index-url https://private.pypi.org/simple/ package-name14.2 使用devpi# 安装devpipip install devpi-server devpi-client# 启动服务器devpi-server --start# 配置客户端devpi use http://localhost:3141十五、工具对比venv- 标准库无需安装- 简单轻量- 只管理虚拟环境pipenv- 统一管理虚拟环境和依赖- Pipfile更易读- 自动处理依赖关系poetry- 现代化工具- 强大的依赖解析- 支持构建和发布- 性能较好conda- 适合科学计算- 可管理非Python依赖- 跨平台二进制包十六、总结Python的包管理生态系统提供了多种工具选择。对于简单项目venvpip足够对于复杂项目poetry或pipenv提供了更好的依赖管理体验。选择合适的工具建立良好的依赖管理习惯可以大大提高开发效率和项目可维护性。