news 2026/5/15 5:33:18

解决pip install torch报错:PyTorch安装全攻略与避坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
解决pip install torch报错:PyTorch安装全攻略与避坑指南

1. 问题引入与核心场景剖析

最近在帮几个刚入坑深度学习的同学配置环境,发现一个高频出现的“拦路虎”:兴致勃勃地敲下pip install torch,结果终端无情地抛出一句ERROR: Could not find a version that satisfies the requirement torch (from versions: none)或者ERROR: No matching distribution found for torch。这感觉就像你兴冲冲跑去一家知名餐厅,结果服务员告诉你“本店不提供这道菜”一样让人瞬间懵圈。这个PackageNotFoundError报错,本质上不是你的代码写错了,也不是网络彻底断了,而是pip这个“点餐员”没能在它默认的“菜单”(即 PyPI 官方仓库)里找到名为torch的这道“菜”的正确上菜方式。

PyTorch(torch是其 Python 包名)的安装之所以特殊,是因为它不是一个纯粹的、跨平台通用的 Python 源码包。它底层依赖高度优化的 C++ 和 CUDA 代码,并且需要与特定版本的 CUDA 工具包、cuDNN 库精确匹配,才能发挥 GPU 加速的威力。因此,PyTorch 官方并没有将编译好的二进制包(wheel)直接上传到 PyPI 的默认索引中。如果你直接pip install torchpip会去https://pypi.org/simple/torch/找,那里确实有一个叫torch的包,但那是一个完全不同的、极其古老的包(最后一次更新是2016年),并非我们现在要的 PyTorch。这就导致了经典的“包名冲突”和“仓库不对”的问题。

解决这个问题的核心思路非常明确:pip指定正确的“餐厅地址”,即 PyTorch 官方维护的、包含预编译二进制包的专属仓库。同时,你需要根据自己系统的“口味”(操作系统、Python 版本、CUDA 版本或是否需要CPU版本)来点餐。接下来,我将从问题根因、标准解决方案、进阶排查和避坑指南四个层面,帮你彻底搞定这个烦人的错误。

2. 根因深度拆解:为什么pip install torch会失败?

要解决问题,先得理解问题背后的机制。这个报错背后是 Python 包管理生态中“源”(Source)与“包”(Package)的匹配逻辑。

2.1 PyPI 默认源与包命名冲突

Python 包索引 PyPI 是一个巨大的公共仓库。当你执行pip install <package_name>时,pip默认会查询https://pypi.org/simple/<package_name>/。对于大多数纯 Python 包或提供通用二进制 wheel 的包(如numpy,pandas),这种方式完美工作。

然而,torch这个名字在 PyPI 上被占用了。一个名为torch的古老包(一个张量运算库)长期存在。PyTorch 团队为了避免冲突,并管理复杂的二进制分发,选择了不将主要的torch包发布到 PyPI 的默认索引。他们建立了自己的下载服务器和索引。因此,当你请求torch时,pip在默认源找到的是那个旧包,而旧包很可能与你当前 Python 环境不兼容(例如,不支持 Python 3.7+),于是pip就报告“找不到满足要求的版本”。

2.2 PyTorch 的分发策略:系统、Python 与 CUDA 的三元组

PyTorch 的安装包不是“一体通用”的。官方需要为以下组合提供不同的预编译二进制文件(.whl):

  1. 操作系统:Windows, Linux, macOS。
  2. Python 版本:如 3.8, 3.9, 3.10, 3.11 等。不同版本 Python 的 ABI(应用程序二进制接口)可能不兼容。
  3. 计算平台
    • CUDA 版本:例如cu116(CUDA 11.6),cu117,cu118,cu121等。这决定了包能否调用你显卡上的 NVIDIA 驱动和 CUDA 工具包进行加速。
    • CPU 版本:不包含 CUDA 支持,仅使用 CPU 进行计算。

这种精细化的分发策略保证了最佳性能和兼容性,但也使得安装命令必须足够“精确”,才能定位到正确的文件。pip的默认源无法处理如此复杂的、依赖特定系统属性的查询逻辑。

2.3 网络环境与镜像源的影响

即使你知道了正确的安装命令,网络问题也可能导致PackageNotFoundError的变体。例如,你指定的官方下载地址download.pytorch.org在某些地区访问可能缓慢或不稳定。虽然国内有清华、阿里云等 PyPI 镜像源,但它们通常只镜像 PyPI 官方索引的内容,不一定完整镜像 PyTorch 官方的专属仓库(https://download.pytorch.org/whl/)。如果你错误地配置了镜像源,并期望它也能下载 PyTorch,就可能因为镜像源没有对应的包而失败。

3. 标准解决方案:使用官方推荐命令安装

最可靠、最推荐的方法永远是访问 PyTorch 官方网站 。官网提供了一个交互式选择器,让你根据你的系统配置生成正确的pipconda命令。

3.1 访问官网获取精确命令

  1. 打开https://pytorch.org/get-started/locally/
  2. 在 “PyTorch Build” 部分,选择稳定版(Stable)。
  3. 在 “Your OS” 选择你的操作系统(Linux, Mac, Windows)。
  4. 在 “Package” 选择pip
  5. 在 “Language” 选择Python
  6. 在 “Compute Platform” 选择你的计算平台:
    • 如果你有 NVIDIA 显卡并已安装 CUDA,请选择对应的 CUDA 版本(如CUDA 11.8)。你可以通过在命令行输入nvidia-smi来查看驱动支持的 CUDA 最高版本。
    • 如果你没有 NVIDIA 显卡,或者不想使用 GPU,请选择CPU
  7. 网页下方会自动生成一行pip安装命令。

例如,对于在 Linux 系统上,使用 Python 3.8 和 CUDA 11.8 的用户,生成的命令可能类似于:

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

对于 Windows 系统、仅使用 CPU 的用户,命令可能类似于:

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu

关键点解析

  • --index-url: 这是核心参数。它告诉pip:“不要再去默认的 PyPI 找了,去我指定的这个网址找包。” 这里指向的就是 PyTorch 官方的 wheel 仓库。
  • https://download.pytorch.org/whl/cu118: 这个 URL 结构清晰,cu118表示 CUDA 11.8 版本的包目录。
  • torchvisiontorchaudio: 这是 PyTorch 生态中常用的视觉和音频库,通常建议一并安装以保证兼容性。

3.2 直接使用pip install配合--index-url

如果你无法访问官网,或者想手动拼接命令,可以遵循以下格式:

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/<compute_platform>

<compute_platform>替换为你的计算平台标识符,常见的有:

  • cu121: CUDA 12.1
  • cu118: CUDA 11.8
  • cu117: CUDA 11.7
  • cu116: CUDA 11.6
  • cpu: 仅 CPU 版本

注意:CUDA 版本的选择不一定要和你系统安装的 CUDA 工具包版本完全一致,但必须小于等于你显卡驱动支持的最高 CUDA 版本,并且 PyTorch 二进制包是针对特定 CUDA 版本编译的,最好匹配。你可以安装比系统 CUDA 工具包版本低的 PyTorch CUDA 版本(例如系统是 CUDA 12.1,安装cu118的 PyTorch),但反之则可能不行。

3.3 使用pip install直接指定 wheel 文件 URL(终极方案)

如果上述方法仍因网络问题失败,你可以直接找到对应 wheel 文件的完整 URL 进行安装。这需要你知道系统的完整配置。

  1. 确定系统标签:你需要知道你的系统标签,格式如cp38-cp38-manylinux_2_17_x86_64。一个简单的方法是,先尝试用--index-url安装,在pip开始下载前,它会打印出它找到的候选包 URL,从中你可以看到完整的 wheel 文件名。
  2. 拼接 URL:PyTorch 官方 wheel 仓库的 URL 模式通常是:https://download.pytorch.org/whl/<compute_platform>/torch-<version>%2B<compute_platform>-<system_tag>.whl例如:https://download.pytorch.org/whl/cu118/torch-2.1.0%2Bcu118-cp38-cp38-manylinux_2_17_x86_64.whl
  3. 直接安装
    pip install https://download.pytorch.org/whl/cu118/torch-2.1.0%2Bcu118-cp38-cp38-manylinux_2_17_x86_64.whl
    这种方法绕过了pip的索引查询,直接下载文件,对于网络环境特殊的情况非常有效。你可以用下载工具先下载好 .whl 文件,然后进行本地安装:pip install /path/to/downloaded.whl

4. 进阶排查与常见问题场景实录

即使按照官方命令操作,你可能还会遇到一些衍生问题。下面是我在实际支持项目中遇到的几个典型案例和解决方法。

4.1 案例一:镜像源配置冲突导致安装失败

场景:用户已经配置了清华的 PyPI 镜像源(在~/.pip/pip.conf或使用-i参数),然后运行官方提供的pip install ... --index-url https://download.pytorch.org/...命令,但依然失败,错误信息可能提示在镜像源地址找不到torch

根因pip的源配置有优先级。当同时使用-i--index-url的短格式)和--index-url时,后者会覆盖前者。但如果你在配置文件中设置了全局镜像源,并且命令中没有使用--index-url,或者某些旧版本pip的行为有差异,就可能导致pip仍然去错误的镜像源查找。

解决方案

  1. 临时禁用镜像源:在安装 PyTorch 的命令中,明确使用--index-url指向官方地址,并确保没有其他源参数冲突。最干净的方式是:
    pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 --no-cache-dir
    添加--no-cache-dir可以避免使用可能已污染的缓存。
  2. 检查 pip 配置:运行pip config list查看当前生效的配置。如果发现index-url被设置为某个镜像源,而你确实想用官方源安装 PyTorch,可以在命令前临时覆盖:
    pip install --index-url https://download.pytorch.org/whl/cu118 torch torchvision torchaudio
  3. 使用虚拟环境:创建一个全新的虚拟环境(使用venvconda),在新的环境中,默认没有全局的 pip 配置文件干扰,安装最干净。

4.2 案例二:Python 版本与系统架构不匹配

场景:在 Apple Silicon (M1/M2/M3) 的 macOS 上,使用官方命令安装后,导入torch可能报错,或者无法利用 GPU(Metal Performance Shaders, MPS)。

根因:从 PyTorch 1.12 开始,官方才提供原生支持 Apple Silicon 的版本。如果你选择了错误的 Python 版本(比如通过 Rosetta 转译的 x86_64 版 Python),或者安装命令没有指定正确的平台,就会出问题。

解决方案(macOS Apple Silicon)

  1. 确保使用原生的 arm64 Python:通过官方安装程序或brew install python安装的 Python 通常是原生的。在终端运行python -c "import platform; print(platform.machine())",应输出arm64
  2. 使用正确的安装命令:对于 macOS,计算平台应选择CPU。但为了激活 MPS 后端,你需要安装 Nightly 版本或者特定版本后的稳定版。官网选择器在 macOS 下通常会自动给出正确的命令。一个通用的、支持 MPS 的命令格式是:
    pip install torch torchvision torchaudio
    注意:对于 macOS ARM64,PyTorch 现在直接将预编译的 wheel 上传到了 PyPI 官方索引。所以你可以直接使用pip install torch而无需--index-url!这是 macOS 平台的一个特例。如果直接安装失败,依然可以回退到使用官方索引:
    pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cpu

4.3 案例三:Windows 系统上的典型陷阱

场景:Windows 用户使用官方命令安装后,运行时可能出现ImportError: DLL load failed或类似错误。

根因

  1. VC++ 可再发行组件包缺失:PyTorch 依赖 Microsoft Visual C++ Redistributable。
  2. NVIDIA 驱动/CUDA 版本不匹配:安装的 PyTorch CUDA 版本需要对应的 NVIDIA 驱动支持。例如,cu118通常需要驱动版本 >= 450.80.02。
  3. 路径问题:CUDA 和 cuDNN 的路径没有正确添加到系统环境变量PATH中。

解决方案

  1. 安装 VC++ 可再发行组件:从微软官网下载并安装最新版的 “Microsoft Visual C++ Redistributable”。
  2. 更新显卡驱动:前往 NVIDIA 官网,下载并安装适合你显卡的最新版 Game Ready 或 Studio 驱动。
  3. 验证 CUDA 环境(如安装CUDA版)
    • 如果你安装了 CUDA 版本的 PyTorch,请确保系统安装了对应版本的 CUDA 工具包和 cuDNN,并将它们的binlib等目录添加到系统PATH变量中。
    • 一个更简单的方法是:只安装 PyTorch CUDA 版本,而不单独安装完整的 CUDA 工具包。PyTorch 的 wheel 包通常自带了必要的 CUDA 运行时库。只要你的 NVIDIA 驱动足够新,就能运行。这是目前最推荐的方式。你可以通过nvidia-smi查看驱动版本,然后去 PyTorch 官网选择该驱动支持的 CUDA 版本即可。
  4. 使用 Conda 安装(替代方案):在 Windows 上,使用 Anaconda 或 Miniconda 配合conda install pytorch torchvision torchaudio cudatoolkit=11.8 -c pytorch -c nvidia命令安装,环境管理更为方便,能自动处理很多底层依赖。

4.4 案例四:Linux 服务器无 root 权限安装

场景:在学校的实验室服务器或公司的开发机上,没有 root 权限,无法修改系统 Python 包,也无法将包安装到系统目录。

解决方案

  1. 使用--user标志:这是最直接的方法。该标志将包安装到当前用户的 home 目录下(通常是~/.local/lib/pythonX.Y/site-packages/)。
    pip install --user torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
    安装后,确保你的PYTHONPATH环境变量包含了~/.local/lib/pythonX.Y/site-packages,或者 Python 能自动识别用户目录。
  2. 使用虚拟环境:这是更专业、更推荐的做法。在你有写权限的目录下创建虚拟环境。
    # 创建虚拟环境 python -m venv ~/my_pytorch_env # 激活虚拟环境 (Linux/macOS) source ~/my_pytorch_env/bin/activate # 激活后,pip 安装的包都会在这个隔离的环境里 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
    每次使用前激活环境即可,完全不影响系统和其他用户。
  3. 使用 Conda/Mamba:如果你有安装 Miniconda 的权限(可以安装在用户目录下),那么 Conda 是管理复杂科学计算环境(尤其是涉及 CUDA)的利器,它能更好地解决二进制依赖问题。

5. 安装验证与后续配置指南

安装完成后,千万不要以为万事大吉。进行验证是必不可少的一步,它能帮你确认安装是否真正成功,以及关键功能(如 GPU)是否可用。

5.1 基础验证脚本

创建一个简单的 Python 脚本(例如verify_torch.py)并运行:

import torch print(f"PyTorch 版本: {torch.__version__}") print(f"CUDA 是否可用: {torch.cuda.is_available()}") if torch.cuda.is_available(): print(f"CUDA 版本: {torch.version.cuda}") print(f"当前 GPU 设备: {torch.cuda.get_device_name(0)}") print(f"GPU 设备数量: {torch.cuda.device_count()}") else: print("CUDA 不可用,将使用 CPU 进行计算。") # 创建一个简单的张量进行运算测试 x = torch.rand(5, 3) y = torch.ones(5, 3) z = x + y print(f"\n随机张量 x:\n{x}") print(f"\n计算 x + 1 的结果 z:\n{z}") print(f"\n张量 z 的大小: {z.size()}")

预期输出

  • 如果安装了 CPU 版本,torch.cuda.is_available()会返回False
  • 如果安装了 CUDA 版本且环境配置正确,它会返回True,并显示 CUDA 版本和 GPU 型号。
  • 最后的部分演示了基本的张量操作,确保 PyTorch 核心功能正常。

5.2 GPU 版本安装后的深度验证

如果安装了 CUDA 版本,除了基础验证,还应测试 GPU 计算和内存操作:

import torch if torch.cuda.is_available(): device = torch.device("cuda:0") # 使用第一个 GPU # 测试 GPU 张量创建和计算 a_gpu = torch.rand(10000, 10000, device=device) b_gpu = torch.rand(10000, 10000, device=device) c_gpu = torch.mm(a_gpu, b_gpu) # 矩阵乘法,GPU 计算 print("GPU 矩阵乘法计算完成。") # 测试 CPU 和 GPU 之间的数据转移 a_cpu = torch.rand(5, 5) a_to_gpu = a_cpu.to(device) a_back_to_cpu = a_to_gpu.cpu() print("CPU-GPU 数据转移测试完成。") # 清理 GPU 缓存 (可选,用于诊断内存问题) torch.cuda.empty_cache() print(f"当前 GPU 内存占用: {torch.cuda.memory_allocated(device)/1024**3:.2f} GB") else: print("GPU 不可用,无法进行深度 GPU 测试。")

5.3 常见验证失败问题排查

  1. torch.cuda.is_available()返回 False,但已安装 CUDA 版本

    • 检查 NVIDIA 驱动:运行nvidia-smi,确保驱动已安装且正在运行。
    • 检查 PyTorch CUDA 版本与系统兼容性nvidia-smi右上角会显示驱动支持的最高CUDA 版本。你安装的 PyTorch CUDA 版本(如cu118)必须 ≤ 这个版本。例如,驱动支持 CUDA 12.1,你可以安装cu121,cu118,cu117等。如果驱动太旧,请更新。
    • 检查环境变量:某些情况下需要确保 CUDA 的路径在PATH中。但如前所述,PyTorch wheel 常自带运行时,此问题较少见。
  2. 导入torch时出现ImportError

    • 包未正确安装:在 Python 中运行import sys; print(sys.path),检查你的 PyTorch 安装路径是否在 Python 的搜索路径中。如果使用--user安装,确保路径存在。
    • 虚拟环境未激活:如果你在虚拟环境中安装,但在全局或其他环境中运行脚本,自然会找不到包。请确认终端提示符前有虚拟环境名(如(my_pytorch_env))。
    • 包损坏:尝试重新安装,并添加--force-reinstall--no-cache-dir标志。

6. 环境管理与最佳实践建议

为了避免未来再次陷入“包地狱”,建立良好的环境管理习惯至关重要。

6.1 强制使用虚拟环境

无论是使用venvvirtualenv还是conda永远不要在系统的全局 Python 环境中直接安装项目依赖。为每个项目创建独立的虚拟环境。

  • venv(Python 3.3+ 内置)

    # 创建 python -m venv project_env # 激活 (Linux/macOS) source project_env/bin/activate # 激活 (Windows) project_env\Scripts\activate # 在激活的环境中安装 PyTorch pip install torch ... --index-url ...
  • Conda/Mamba:对于数据科学和深度学习项目,Conda 能管理 Python 包和非 Python 依赖(如 CUDA 工具包),更为强大。

    # 创建指定 Python 版本的环境 conda create -n pytorch_project python=3.9 conda activate pytorch_project # 使用 conda 安装 PyTorch (从 pytorch 频道) conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia # 或者,在 conda 环境中使用 pip 安装 (有时更灵活) pip install torch torchvision torchaudio --index-url ...

6.2 固化环境依赖

项目完成后,将环境依赖导出,方便自己或他人复现。

  • 使用pip

    # 导出所有包及版本 pip freeze > requirements.txt # 在新环境中安装 pip install -r requirements.txt

    注意requirements.txttorch的链接会是完整的 wheel URL,这可能导致在其他机器上安装时仍然去原地址下载。对于团队协作,建议在requirements.txt中只写torch==2.1.0这样的版本号,并附上详细的安装说明(如指定的--index-url)。

  • 使用conda

    # 导出环境 conda env export > environment.yml # 根据 yml 文件创建环境 conda env create -f environment.yml

6.3 选择合适的 PyTorch 版本

  • 稳定性优先:生产环境或学习阶段,优先选择 Stable(稳定版)。
  • 尝鲜新特性:研究或需要最新功能时,可以考虑 Nightly(每日构建版),但需注意其可能不稳定。安装 Nightly 版通常使用--index-url https://download.pytorch.org/whl/nightly/<compute_platform>
  • 版本兼容性:注意 PyTorch 版本与你的代码、其他库(如torchvision,torchaudio)的兼容性。通常建议按照官网选择器生成的命令,同时安装版本匹配的torch,torchvision,torchaudio

6.4 网络问题终极备选方案

如果因为网络原因,所有通过pip在线安装的方式都失败,可以考虑:

  1. 离线安装
    • 在一台能正常访问外网的机器上,使用pip download命令下载 wheel 包及其所有依赖。
    pip download torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 -d ./pytorch_packages
    • 将下载的.whl文件拷贝到目标机器,使用pip install --no-index --find-links=./pytorch_packages torch torchvision torchaudio进行离线安装。
  2. 使用国内镜像站:部分国内镜像站(如阿里云、清华源)的pytorch频道可能同步了官方仓库。你可以尝试将--index-url替换为镜像站地址(需要确认该镜像站确实同步了whl目录)。例如(地址需自行核实):
    pip install torch torchvision torchaudio --index-url https://mirrors.aliyun.com/pytorch-wheels/cu118
    注意:镜像站的同步可能有延迟,且不一定包含所有版本和平台,此方法不如官方源可靠。

解决pip install torchPackageNotFoundError的过程,本质上是一次对 Python 包分发机制和深度学习环境配置的深入理解。核心诀窍就是绕过默认的 PyPI 索引,直连 PyTorch 官方的二进制分发仓库。记住这个黄金命令结构:pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/<compute_platform>。在实战中,结合虚拟环境管理、驱动版本核对以及安装后验证,你就能游刃有余地搭建起稳定的 PyTorch 开发环境,把更多精力投入到有趣的模型构建和算法实现中去。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/15 5:32:18

ARM GICv3中断控制器与ICH_MISR寄存器详解

1. ARM中断控制器与GICv3架构概述在ARM架构的嵌入式系统中&#xff0c;中断控制器是连接外设与处理器的关键枢纽。作为系统实时性的重要保障&#xff0c;它负责高效管理和分发各类硬件中断请求。GIC&#xff08;Generic Interrupt Controller&#xff09;作为ARM体系的标准中断…

作者头像 李华
网站建设 2026/5/15 5:31:05

Cheat Engine 实战入门:从零到一的内存修改指南

1. Cheat Engine 是什么&#xff1f;能做什么&#xff1f; 第一次听说Cheat Engine&#xff08;简称CE&#xff09;的朋友可能会觉得这是个很高深的工具&#xff0c;其实它就是个"游戏数值修改器"。想象一下你在玩《植物大战僵尸》&#xff0c;阳光总是不够用&#x…

作者头像 李华
网站建设 2026/5/15 5:27:24

UE4渲染管线核心流程拆解与实践指南

1. UE4渲染管线全景概览 第一次打开UE4编辑器时&#xff0c;看到场景中绚丽的光影效果&#xff0c;我就在想&#xff1a;这些画面究竟是怎么一步步绘制出来的&#xff1f;经过几个项目的实践踩坑&#xff0c;终于摸清了这套复杂但精妙的渲染系统。简单来说&#xff0c;UE4的渲染…

作者头像 李华
网站建设 2026/5/15 5:25:43

半导体硅测试与良率分析关键技术解析

1. 硅测试与良率分析概述在半导体制造领域&#xff0c;硅测试与良率分析是确保芯片质量的关键环节。随着工艺节点不断缩小至130nm以下&#xff0c;传统的静态故障检测方法已经无法满足现代集成电路的测试需求。以台积电7nm工艺为例&#xff0c;单个芯片可能包含数十亿个晶体管&…

作者头像 李华
网站建设 2026/5/15 5:25:11

Kubernetes应用管理新范式:kapp-controller声明式部署与GitOps实践

1. 项目概述&#xff1a;Kubernetes应用管理的“控制器”模式实践在云原生领域&#xff0c;Kubernetes已经成为事实上的标准&#xff0c;但如何高效、安全、可重复地管理运行在Kubernetes上的复杂应用&#xff0c;却是一个持续演进的课题。很多团队从最初的kubectl apply -f&am…

作者头像 李华