当前位置: 首页 > news >正文

Python虚拟环境管理:conda、venv、pipenv三国杀

Python虚拟环境管理:conda、venv、pipenv三国杀 🐍

作为一名在Python生态系统中学习实践了六年的开发者,我深刻体会到了Python虚拟环境管理工具的重要性和复杂性。从最初接触virtualenv时的懵懂,到现在熟练使用conda、venv、pipenv等工具,每一次的学习和实践都让我对Python环境管理有了更深的理解。今天,我想和大家分享一下这几年来对这三个主流工具的使用心得,希望能帮助大家在项目中做出更合适的选择。

📚 目录

  • 为什么需要虚拟环境?
  • 三大工具概览
  • venv:Python官方的简洁之选
  • conda:科学计算的全栈解决方案
  • pipenv:现代化的依赖管理
  • 实战对比:同一项目的三种配置方式
  • 选择建议:什么场景用什么工具
  • 高级技巧与最佳实践
  • 常见问题解答
  • 总结与展望

为什么需要虚拟环境?

在深入讨论三个工具之前,让我先分享一个真实的踩坑经历。几年前,我在维护一个老项目时,需要同时使用Django 1.11和Django 3.2两个版本。由于当时没有使用虚拟环境,全局安装的包版本冲突导致两个项目都无法正常运行。这个惨痛的教训让我深刻理解了虚拟环境的重要性。

虚拟环境解决的核心问题包括:

  1. 依赖隔离:不同项目使用不同版本的包
  2. 系统保护:避免污染系统Python环境
  3. 可重现性:确保团队成员使用相同的依赖版本
  4. 部署一致性:开发环境与生产环境保持同步

三大工具概览

特性venvcondapipenv
官方支持✅ Python内置❌ 第三方❌ 第三方
学习成本🟢 低🟡 中等🟡 中等
功能丰富度🟡 基础🟢 全面🟢 丰富
科学计算支持
依赖锁定
跨平台二进制包

venv:Python官方的简洁之选

venv是Python 3.3+内置的虚拟环境工具,简单可靠,是我推荐新手入门的首选。

基本使用示例

# 创建虚拟环境
# 在项目根目录执行以下命令
import subprocess
import osdef create_venv_environment():"""使用venv创建虚拟环境的完整流程这个函数演示了如何通过Python代码管理venv环境"""project_name = "my_web_project"venv_path = f"./{project_name}_env"# 1. 创建虚拟环境print("🔧 创建虚拟环境...")subprocess.run(["python", "-m", "venv", venv_path], check=True)# 2. 确定激活脚本路径(跨平台兼容)if os.name == 'nt':  # Windowsactivate_script = f"{venv_path}\\Scripts\\activate.bat"pip_path = f"{venv_path}\\Scripts\\pip.exe"else:  # Unix/Linux/macOSactivate_script = f"{venv_path}/bin/activate"pip_path = f"{venv_path}/bin/pip"print(f"✅ 虚拟环境创建成功:{venv_path}")print(f"📝 激活命令:source {activate_script}")# 3. 安装常用包(需要先激活环境)packages = ["requests", "flask", "pytest"]for package in packages:print(f"📦 安装 {package}...")subprocess.run([pip_path, "install", package], check=True)# 4. 生成requirements.txtprint("📋 生成依赖文件...")with open("../requirements.txt", "w") as f:result = subprocess.run([pip_path, "freeze"],capture_output=True, text=True)f.write(result.stdout)print("🎉 环境配置完成!")# 执行环境创建(注释掉避免实际执行)
# create_venv_environment()

venv的优势与局限

优势:

  • 🟢 Python内置,无需额外安装
  • 🟢 轻量级,启动快速
  • 🟢 与Python版本紧密集成
  • 🟢 学习成本低

局限:

  • 🔴 只能管理Python包,不支持系统级依赖
  • 🔴 没有依赖锁定机制
  • 🔴 不支持多Python版本管理

conda:科学计算的全栈解决方案

conda不仅仅是一个虚拟环境管理工具,更是一个完整的包管理系统。在数据科学和机器学习项目中,conda几乎是标配。

conda环境管理实战

import subprocess
import json
import osclass CondaManager:"""Conda环境管理器封装了常用的conda操作,便于在Python脚本中管理环境"""def __init__(self):self.conda_executable = self._find_conda()def _find_conda(self):"""查找conda可执行文件路径"""try:result = subprocess.run(["conda", "--version"], capture_output=True, text=True)return "conda" if result.returncode == 0 else Noneexcept FileNotFoundError:return Nonedef create_environment(self, env_name, python_version="3.9", packages=None):"""创建conda环境Args:env_name: 环境名称python_version: Python版本packages: 要安装的包列表"""if not self.conda_executable:raise RuntimeError("Conda未安装或未添加到PATH")print(f"🔧 创建环境 {env_name} (Python {python_version})...")# 创建环境并指定Python版本cmd = [self.conda_executable, "create", "-n", env_name, f"python={python_version}", "-y"]subprocess.run(cmd, check=True)# 安装指定包if packages:self.install_packages(env_name, packages)print(f"✅ 环境 {env_name} 创建成功")def install_packages(self, env_name, packages):"""在指定环境中安装包"""for package in packages:print(f"📦 安装 {package}{env_name}...")cmd = [self.conda_executable, "install", "-n", env_name, package, "-y"]try:subprocess.run(cmd, check=True)except subprocess.CalledProcessError:# 如果conda安装失败,尝试pipprint(f"⚠️ conda安装失败,尝试pip安装 {package}")pip_cmd = [self.conda_executable, "run", "-n", env_name, "pip", "install", package]subprocess.run(pip_cmd, check=True)def list_environments(self):"""列出所有conda环境"""cmd = [self.conda_executable, "env", "list", "--json"]result = subprocess.run(cmd, capture_output=True, text=True)envs_data = json.loads(result.stdout)print("📋 Conda环境列表:")for env_path in envs_data["envs"]:env_name = os.path.basename(env_path)print(f"  - {env_name}: {env_path}")def export_environment(self, env_name, output_file="environment.yml"):"""导出环境配置"""print(f"📤 导出环境 {env_name}{output_file}...")cmd = [self.conda_executable, "env", "export", "-n", env_name, "-f", output_file]subprocess.run(cmd, check=True)print(f"✅ 环境配置已导出到 {output_file}")# 使用示例
def demo_conda_workflow():"""演示完整的conda工作流程"""manager = CondaManager()# 数据科学项目环境配置ds_packages = ["numpy", "pandas", "matplotlib", "seaborn", "scikit-learn", "jupyter", "notebook"]# Web开发项目环境配置  web_packages = ["flask", "django", "requests", "gunicorn"]try:# 创建数据科学环境manager.create_environment("data_science", "3.9", ds_packages)# 创建Web开发环境manager.create_environment("web_dev", "3.10", web_packages)# 列出所有环境manager.list_environments()# 导出环境配置manager.export_environment("data_science", "ds_environment.yml")except Exception as e:print(f"❌ 操作失败: {e}")# 执行演示(注释掉避免实际执行)
# demo_conda_workflow()

conda的environment.yml配置

# environment.yml - conda环境配置文件示例
name: ml_project
channels:- conda-forge- defaults
dependencies:- python=3.9- numpy>=1.20.0- pandas>=1.3.0- matplotlib>=3.4.0- scikit-learn>=1.0.0- jupyter- notebook- pip- pip:- streamlit>=1.15.0- plotly>=5.11.0- fastapi>=0.85.0

pipenv:现代化的依赖管理

pipenv是Kenneth Reitz(requests库作者)开发的工具,它结合了pip和virtualenv的优势,并引入了Pipfile和Pipfile.lock的概念。

pipenv完整工作流程

import subprocess
import json
import os
from pathlib import Pathclass PipenvManager:"""Pipenv项目管理器提供了pipenv的Python接口,便于自动化项目配置"""def __init__(self, project_path="."):self.project_path = Path(project_path).resolve()self.pipfile_path = self.project_path / "Pipfile"self.pipfile_lock_path = self.project_path / "Pipfile.lock"def init_project(self, python_version="3.9"):"""初始化pipenv项目Args:python_version: 指定Python版本"""print(f"🚀 初始化Pipenv项目 (Python {python_version})...")# 切换到项目目录original_cwd = os.getcwd()os.chdir(self.project_path)try:# 初始化pipenv环境cmd = ["pipenv", "--python", python_version]subprocess.run(cmd, check=True)print("✅ Pipenv环境初始化成功")finally:os.chdir(original_cwd)def install_packages(self, packages, dev=False):"""安装包到pipenv环境Args:packages: 包列表或单个包名dev: 是否为开发依赖"""if isinstance(packages, str):packages = [packages]original_cwd = os.getcwd()os.chdir(self.project_path)try:for package in packages:print(f"📦 安装 {package}{'(开发依赖)' if dev else ''}...")cmd = ["pipenv", "install", package]if dev:cmd.append("--dev")subprocess.run(cmd, check=True)finally:os.chdir(original_cwd)def generate_requirements(self):"""生成requirements.txt文件"""original_cwd = os.getcwd()os.chdir(self.project_path)try:print("📋 生成requirements.txt...")with open("requirements.txt", "w") as f:result = subprocess.run(["pipenv", "requirements"], capture_output=True, text=True, check=True)f.write(result.stdout)# 生成开发依赖的requirementsprint("📋 生成requirements-dev.txt...")with open("requirements-dev.txt", "w") as f:result = subprocess.run(["pipenv", "requirements", "--dev"], capture_output=True, text=True, check=True)f.write(result.stdout)finally:os.chdir(original_cwd)def create_pipfile_template(self):"""创建Pipfile模板"""pipfile_content = '''[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"[packages]
# 生产依赖
requests = "*"
flask = "*"
gunicorn = "*"
python-dotenv = "*"[dev-packages]
# 开发依赖
pytest = "*"
pytest-cov = "*"
black = "*"
flake8 = "*"
mypy = "*"[requires]
python_version = "3.9"[scripts]
# 自定义脚本
test = "pytest tests/"
lint = "flake8 src/"
format = "black src/"
dev = "flask run --debug"
'''with open(self.pipfile_path, "w") as f:f.write(pipfile_content)print(f"📝 Pipfile模板已创建:{self.pipfile_path}")def run_script(self, script_name):"""运行Pipfile中定义的脚本"""original_cwd = os.getcwd()os.chdir(self.project_path)try:print(f"🏃 执行脚本: {script_name}")cmd = ["pipenv", "run", script_name]subprocess.run(cmd, check=True)finally:os.chdir(original_cwd)# 实际项目配置示例
def setup_web_project():"""配置一个完整的Web项目环境"""project_name = "my_web_app"# 创建项目目录project_path = Path(project_name)project_path.mkdir(exist_ok=True)# 初始化pipenv管理器manager = PipenvManager(project_path)# 创建Pipfile模板manager.create_pipfile_template()# 初始化环境manager.init_project("3.9")# 安装生产依赖production_packages = ["flask", "requests", "gunicorn", "python-dotenv"]manager.install_packages(production_packages)# 安装开发依赖dev_packages = ["pytest", "black", "flake8", "pytest-cov"]manager.install_packages(dev_packages, dev=True)# 生成requirements文件manager.generate_requirements()print(f"🎉 项目 {project_name} 配置完成!")print(f"📁 项目路径: {project_path.resolve()}")print("🔧 常用命令:")print("  pipenv shell          # 激活环境")print("  pipenv run test       # 运行测试")print("  pipenv run dev        # 启动开发服务器")# 执行项目配置(注释掉避免实际执行)
# setup_web_project()

实战对比:同一项目的三种配置方式

让我通过一个实际的Flask Web项目来展示三种工具的不同配置方式:

项目需求

  • Flask Web应用
  • 数据库操作(SQLAlchemy)
  • 测试框架(pytest)
  • 代码格式化(black)

venv方式配置

# 创建并激活环境
python -m venv flask_app_venv
source flask_app_venv/bin/activate  # Linux/macOS
# flask_app_venv\Scripts\activate   # Windows# 安装依赖
pip install flask sqlalchemy pytest black# 生成依赖文件
pip freeze > requirements.txt
# requirements.txt 内容示例
Flask==2.3.3
SQLAlchemy==2.0.21
pytest==7.4.2
black==23.9.1
click==8.1.7
itsdangerous==2.1.2
Jinja2==3.1.2
MarkupSafe==2.1.3
Werkzeug==2.3.7

conda方式配置

# environment.yml
name: flask_app
channels:- conda-forge- defaults
dependencies:- python=3.9- flask=2.3.3- sqlalchemy=2.0.21- pytest=7.4.2- pip- pip:- black==23.9.1
# 创建环境
conda env create -f environment.yml
conda activate flask_app

pipenv方式配置

# Pipfile
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"[packages]
flask = "==2.3.3"
sqlalchemy = "==2.0.21"[dev-packages]
pytest = "==7.4.2"
black = "==23.9.1"[requires]
python_version = "3.9"[scripts]
test = "pytest tests/"
format = "black app/"
dev = "flask run --debug"
# 初始化并安装
pipenv install
pipenv install --dev

选择建议:什么场景用什么工具

🎯 选择决策树

def choose_environment_tool(project_type, team_size, complexity):"""环境工具选择决策函数Args:project_type: 项目类型 ('web', 'data_science', 'ml', 'general')team_size: 团队规模 ('solo', 'small', 'large')complexity: 项目复杂度 ('simple', 'medium', 'complex')Returns:推荐的工具及理由"""recommendations = {'venv': {'score': 0,'reasons': []},'conda': {'score': 0,'reasons': []},'pipenv': {'score': 0,'reasons': []}}# 项目类型评分if project_type in ['data_science', 'ml']:recommendations['conda']['score'] += 3recommendations['conda']['reasons'].append("科学计算包管理优势")elif project_type == 'web':recommendations['pipenv']['score'] += 2recommendations['pipenv']['reasons'].append("现代化依赖管理")recommendations['venv']['score'] += 1recommendations['venv']['reasons'].append("轻量级选择")# 团队规模评分if team_size == 'solo':recommendations['venv']['score'] += 2recommendations['venv']['reasons'].append("简单易用,学习成本低")elif team_size == 'large':recommendations['conda']['score'] += 2recommendations['conda']['reasons'].append("环境一致性保证")recommendations['pipenv']['score'] += 2recommendations['pipenv']['reasons'].append("依赖锁定机制")# 复杂度评分if complexity == 'simple':recommendations['venv']['score'] += 2recommendations['venv']['reasons'].append("满足基本需求")elif complexity == 'complex':recommendations['conda']['score'] += 2recommendations['conda']['reasons'].append("全栈解决方案")recommendations['pipenv']['score'] += 1recommendations['pipenv']['reasons'].append("高级依赖管理")# 找出最高分的工具best_tool = max(recommendations.keys(), key=lambda x: recommendations[x]['score'])return {'recommended': best_tool,'score': recommendations[best_tool]['score'],'reasons': recommendations[best_tool]['reasons'],'all_scores': recommendations}# 使用示例
scenarios = [('web', 'small', 'medium'),('data_science', 'solo', 'complex'),('general', 'large', 'simple'),('ml', 'small', 'complex')
]for scenario in scenarios:result = choose_environment_tool(*scenario)project_type, team_size, complexity = scenarioprint(f"\n📊 场景: {project_type} | {team_size} | {complexity}")print(f"🏆 推荐工具: {result['recommended']}")print(f"📝 推荐理由: {', '.join(result['reasons'])}")

🔍 详细使用建议

选择venv的场景:

  • 🟢 学习Python或简单项目
  • 🟢 只需要基本的环境隔离
  • 🟢 团队已有成熟的部署流程
  • 🟢 希望使用Python内置工具

选择conda的场景:

  • 🟢 数据科学、机器学习项目
  • 🟢 需要非Python依赖(如CUDA、MKL)
  • 🟢 跨平台二进制包管理
  • 🟢 科学计算库的复杂依赖

选择pipenv的场景:

  • 🟢 现代Web应用开发
  • 🟢 需要精确的依赖版本控制
  • 🟢 团队协作项目
  • 🟢 CI/CD流程中的环境管理

高级技巧与最佳实践

环境变量管理

import os
from pathlib import Pathclass EnvironmentManager:"""跨工具的环境变量管理器支持.env文件和系统环境变量"""def __init__(self, env_file=".env"):self.env_file = Path(env_file)self.env_vars = {}self.load_env_file()def load_env_file(self):"""加载.env文件中的环境变量"""if self.env_file.exists():with open(self.env_file, 'r') as f:for line in f:line = line.strip()if line and not line.startswith('#'):key, value = line.split('=', 1)self.env_vars[key.strip()] = value.strip()def create_env_template(self):"""创建环境变量模板文件"""template = '''# 开发环境配置
FLASK_ENV=development
FLASK_DEBUG=True
SECRET_KEY=your-secret-key-here# 数据库配置
DATABASE_URL=sqlite:///app.db
REDIS_URL=redis://localhost:6379# 第三方服务
API_KEY=your-api-key
EMAIL_USERNAME=your-email@example.com
EMAIL_PASSWORD=your-password# 生产环境配置(部署时修改)
# FLASK_ENV=production
# FLASK_DEBUG=False
# DATABASE_URL=postgresql://user:pass@host:port/dbname
'''with open(self.env_file, 'w') as f:f.write(template)print(f"📝 环境变量模板已创建: {self.env_file}")def set_environment(self):"""设置环境变量到当前进程"""for key, value in self.env_vars.items():os.environ[key] = valueprint(f"✅ 已加载 {len(self.env_vars)} 个环境变量")# 使用示例
env_manager = EnvironmentManager()
env_manager.create_env_template()
env_manager.set_environment()

自动化部署脚本

#!/usr/bin/env python3
"""
通用部署脚本
支持三种虚拟环境工具的自动化部署
"""import subprocess
import sys
import os
from pathlib import Pathclass DeploymentManager:"""部署管理器"""def __init__(self, project_path="."):self.project_path = Path(project_path).resolve()self.tool = self.detect_tool()def detect_tool(self):"""自动检测项目使用的虚拟环境工具"""if (self.project_path / "Pipfile").exists():return "pipenv"elif (self.project_path / "environment.yml").exists():return "conda"elif (self.project_path / "requirements.txt").exists():return "venv"else:raise RuntimeError("未检测到虚拟环境配置文件")def deploy(self):"""执行部署流程"""print(f"🚀 开始部署项目 (使用 {self.tool})...")try:if self.tool == "pipenv":self._deploy_pipenv()elif self.tool == "conda":self._deploy_conda()elif self.tool == "venv":self._deploy_venv()self._run_tests()print("🎉 部署完成!")except subprocess.CalledProcessError as e:print(f"❌ 部署失败: {e}")sys.exit(1)def _deploy_pipenv(self):"""Pipenv部署流程"""print("📦 安装Pipenv依赖...")subprocess.run(["pipenv", "install", "--deploy"], check=True)print("🔧 安装开发依赖...")subprocess.run(["pipenv", "install", "--dev"], check=True)def _deploy_conda(self):"""Conda部署流程"""print("📦 创建Conda环境...")subprocess.run(["conda", "env", "create", "-f", "environment.yml"], check=True)def _deploy_venv(self):"""Venv部署流程"""venv_path = "venv"print("📦 创建虚拟环境...")subprocess.run(["python", "-m", "venv", venv_path], check=True)# 确定pip路径if os.name == 'nt':pip_path = f"{venv_path}\\Scripts\\pip.exe"else:pip_path = f"{venv_path}/bin/pip"print("🔧 安装依赖...")subprocess.run([pip_path, "install", "-r", "requirements.txt"], check=True)def _run_tests(self):"""运行测试"""print("🧪 运行测试...")if self.tool == "pipenv":subprocess.run(["pipenv", "run", "pytest"], check=True)elif self.tool == "conda":# 假设环境名为项目名env_name = self.project_path.namesubprocess.run(["conda", "run", "-n", env_name, "pytest"], check=True)elif self.tool == "venv":if os.name == 'nt':pytest_path = "venv\\Scripts\\pytest.exe"else:pytest_path = "venv/bin/pytest"subprocess.run([pytest_path], check=True)# 使用示例
if __name__ == "__main__":deployer = DeploymentManager()deployer.deploy()

常见问题解答

Q1: 如何在不同工具之间迁移项目?

A: 这是我经常遇到的问题。以下是一个通用的迁移策略:

def migrate_environment(from_tool, to_tool, project_path="."):"""环境工具迁移助手支持在venv、conda、pipenv之间迁移"""migration_map = {('venv', 'pipenv'): migrate_venv_to_pipenv,('venv', 'conda'): migrate_venv_to_conda,('conda', 'pipenv'): migrate_conda_to_pipenv,('conda', 'venv'): migrate_conda_to_venv,('pipenv', 'venv'): migrate_pipenv_to_venv,('pipenv', 'conda'): migrate_pipenv_to_conda,}key = (from_tool, to_tool)if key in migration_map:migration_map[key](project_path)else:print(f"❌ 不支持从 {from_tool}{to_tool} 的迁移")def migrate_venv_to_pipenv(project_path):"""从venv迁移到pipenv"""print("🔄 从venv迁移到pipenv...")# 1. 读取requirements.txtreq_file = Path(project_path) / "requirements.txt"if req_file.exists():with open(req_file) as f:packages = f.read().strip().split('\n')# 2. 初始化pipenvsubprocess.run(["pipenv", "install"] + packages, check=True)print("✅ 迁移完成,建议删除旧的venv目录")else:print("❌ 未找到requirements.txt文件")

Q2: 如何处理包版本冲突?

A: 版本冲突是虚拟环境管理中的常见问题,以下是我的解决策略:

def resolve_package_conflicts():"""包冲突解决策略"""strategies = {'venv': """1. 使用pip-tools生成精确依赖:pip install pip-toolspip-compile requirements.in2. 手动解决冲突:pip install package==specific_version""",'conda': """1. 使用conda的SAT求解器:conda install package --strict-channel-priority2. 指定channel优先级:conda config --add channels conda-forge""",'pipenv': """1. 查看依赖图:pipenv graph2. 更新Pipfile.lock:pipenv lock --clear"""}return strategies

Q3: 如何优化虚拟环境的性能?

def optimize_environment_performance():"""虚拟环境性能优化建议"""optimizations = {'common': ["使用SSD存储虚拟环境","定期清理不用的环境","使用pip缓存加速安装"],'conda': ["配置conda缓存目录","使用mamba作为conda的快速替代","启用libmamba求解器"],'pipenv': ["设置PIPENV_VENV_IN_PROJECT=1","使用--skip-lock跳过锁定文件更新","配置pip镜像源"]}# 配置pip镜像源(适用于所有工具)pip_conf = """
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn
"""print("🚀 性能优化建议:")for tool, tips in optimizations.items():print(f"\n{tool.upper()}:")for tip in tips:print(f"  • {tip}")

总结与展望

经过多年的实战经验,我认为这三个工具各有千秋,没有绝对的优劣之分。选择的关键在于匹配你的具体需求:

🎯 最终建议

  1. 新手入门:从venv开始,理解虚拟环境的基本概念
  2. 数据科学:conda是不二选择,生态完整
  3. 现代Web开发:pipenv提供最佳开发体验
  4. 企业项目:根据团队技术栈和部署环境选择

🔮 技术趋势展望

虚拟环境管理工具仍在快速发展中。我看到的一些趋势包括:

  • Poetry正在崛起,提供了更现代化的依赖管理
  • Docker容器化部署减少了对虚拟环境的依赖
  • 云原生开发环境(如GitHub Codespaces)改变了传统的本地开发模式
  • 微服务架构对环境隔离提出了新要求

无论工具如何变化,理解虚拟环境的核心概念和最佳实践始终是最重要的。希望这篇文章能帮助你在Python虚拟环境管理的道路上少走弯路,选择最适合的工具来提升开发效率。

记住,最好的工具就是你和你的团队最熟悉、最能解决实际问题的那一个。不要为了追求新技术而频繁切换,稳定和高效才是王道! 🚀

相关文章:

  • 广西房地产网站建设360排名优化工具
  • 做网站什么数据库用的多一个产品的市场营销策划方案
  • 产品展示网站方案网站搭建需要什么
  • 校园网站建设必要性山西seo
  • wordpress 主题 建站河南百度推广电话
  • 网页如何发布到服务器上什么是seo?
  • LE AUDIO---Chapter 2. The Bluetooth® LE Audio architecture
  • 在 Logstash 中使用 Ruby 脚本
  • 使用redis服务的redisson架构实现分布式锁
  • Prompt:面向目标的提示词
  • Web 点播播放器如何加载缩略图?
  • SQL关键字三分钟入门:DELETE —— 删除数据
  • js 组装树形结构
  • Mac安装Apache CXF的时候报错:/Library/Internet: No such file or directory
  • Windows下Zookeeper客户端启动缓慢问题分析与解决方案
  • Python训练营-Day33
  • 在ASP.NET Core WebApi中使用标识框架(Identity)
  • 对象实例化内存布局与访问定位
  • spring项目启动sheel脚本
  • SpringBoot 数据库连接池与 ManticoreSearch 兼容性测试
  • 本地如何安装midscene.js运行环境
  • Liunx操作系统笔记2
  • 【AI论文】从跨领域视角重新审视强化学习在大型语言模型推理中的应用
  • 【实时Linux实战系列】基于实时Linux的音频处理应用开发
  • BGP边界网关协议
  • 深度图聚类DGC—Paper Notes