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

快速配置Anaconda清华镜像源安装PyTorch(CPU版)全流程解析

1. 为什么你需要换源一个真实的故事我刚开始学深度学习那会儿装PyTorch这事儿差点把我劝退。那时候啥也不懂就跟着官网教程在Anaconda Prompt里输入了那个经典的conda install pytorch torchvision torchaudio cpuonly -c pytorch。好家伙进度条慢得跟蜗牛爬一样每秒几KB的速度看着那个“Solving environment”转了半天最后还给我弹了个网络错误。一晚上折腾了三四次愣是没装上。后来还是一个师兄路过瞅了一眼我的屏幕轻飘飘地说了句“你连镜像源都不换在这跟国际带宽较什么劲呢” 这才给我打开了新世界的大门。所以如果你现在也在为conda或pip安装包时那令人绝望的下载速度发愁感觉明明百兆千兆的宽带到了这儿就跟拨号上网似的那你来对地方了。换源尤其是换成国内的清华镜像源就是解决这个问题的“特效药”。这背后的道理其实很简单PyTorch、Anaconda这些工具默认的服务器都在国外我们访问需要经过漫长的网络链路速度慢、不稳定还是小事动不动就连接超时才最搞心态。而清华镜像源简单理解就是清华大学维护的一个“国内备份站点”它把国外那些常用的软件包都同步了过来。你从它这里下载就相当于从隔壁邻居家拷贝文件速度自然是飞起。对于咱们只想先安装个CPU版PyTorch来学习、跑跑简单模型的同学来说这个过程本应是顺畅无阻的。你完全没必要在环境配置这种前期准备上耗费大量时间和精力更不应该因此挫伤了学习的热情。今天我就手把手带你走一遍这个流程从Anaconda的环境准备到镜像源的切换再到最终稳稳当当地把PyTorch CPU版请进你的电脑。我敢保证只要你跟着步骤来十分钟之内你就能拥有一个可以随时开始写代码的深度学习环境。2. 前期准备搞定Anaconda这个“大管家”在开始换源和安装之前我们得先确保舞台已经搭好而Anaconda就是我们这场戏的“舞台总监”兼“大管家”。我见过不少新手朋友一上来就急着敲命令结果发现conda命令找不到这才反应过来Anaconda都没装好。所以咱们先花点时间把基础打牢。Anaconda是什么你可以把它想象成一个超级强大的“软件集装箱”管理系统。我们做数据分析、机器学习会用到很多第三方库比如PyTorch、NumPy、Pandas这些库之间往往有复杂的依赖关系。A库需要B库的某个特定版本而C库又和这个版本不兼容这就是著名的“依赖地狱”。Anaconda的核心——conda工具就是来解决这个问题的。它可以为每一个项目创建独立的“集装箱”我们称之为虚拟环境在这个环境里库的版本可以任意搭配互不干扰。比如你项目A需要用PyTorch 1.8项目B想尝鲜PyTorch 2.0用conda创建两个环境就能完美共存。安装Anaconda的注意事项去官网还是国内源我强烈建议你第一次安装时就从清华镜像源的下载页面获取Anaconda安装包。原因和后面换源一样速度快。你可以直接访问清华镜像站的Anaconda归档页面找到最新版本的安装程序通常是Windows 64位的.exe文件或者macOS的.pkg文件。这能避免你从国外官网下载时可能遇到的缓慢问题。安装过程里的“坑”运行安装程序时有一个非常关键的选项叫做“Add Anaconda to my PATH environment variable”。通常安装程序会“贴心”地不推荐你勾选。但我的经验是如果你确定以后会经常使用命令行来操作那就把它勾上。这能让你在任意位置比如普通的CMD或PowerShell都能直接使用conda命令而不必每次都去打开专门的“Anaconda Prompt”。当然如果你不习惯命令行不勾选也行以后我们就老老实实用开始菜单里的“Anaconda Prompt”来操作它已经帮你配置好了路径。安装完成后的验证安装完成后无论是通过开始菜单打开“Anaconda Prompt”如果你没勾选PATH还是直接打开系统自带的CMD或PowerShell如果你勾选了PATH输入以下命令并按回车conda --version如果屏幕上显示了类似conda 24.x.x的版本号那么恭喜你“大管家”已经成功上岗。如果提示“conda不是内部或外部命令”那就说明PATH没配置好回头检查一下或者就认准“Anaconda Prompt”这个专用通道。3. 核心操作一步步配置清华镜像源好了管家就位现在我们来给它指一条“高速路”。配置清华镜像源本质上就是修改conda的配置文件告诉它“以后找软件包别去远在天边的默认仓库了就去清华的站点又快又稳。”3.1 打开你的指挥中心Anaconda Prompt无论你是否将Anaconda加入了系统PATH我都推荐你使用“Anaconda Prompt”来执行下面的命令。你可以在Windows开始菜单的“Anaconda3”文件夹里找到它。打开之后你会看到一个命令行窗口通常路径前面会显示(base)。这个(base)就表示你当前处于Anaconda的基础环境。我们所有的配置命令在基础环境下执行一次就会对所有之后创建的环境生效非常方便。3.2 执行“换源四连”命令接下来请你将下面这四条命令一条一条地复制到Anaconda Prompt中并依次按回车执行。我建议你不要一次性全部复制粘贴因为这样你无法观察每一条命令的执行反馈。放心这些命令都是安全的它们只是添加配置而已。conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/这条命令添加了主包频道这是最核心、最常用的软件包来源。conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/这条命令添加了自由包频道包含一些开源免费的附加包。conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/这是关键一步它专门添加了PyTorch的镜像频道。有了它conda在查找PyTorch及其相关组件如torchvision, torchaudio时就会直接去清华的PyTorch镜像速度有质的飞跃。conda config --set show_channel_urls yes这条命令是让conda在后续安装包时显示软件包具体是从哪个频道channel下载的。设置成yes之后你能清楚地看到包是从https://mirrors.tuna.tsinghua.edu.cn这个地址拉取的心里会特别踏实。3.3 验证与检查确保换源成功执行完上述命令后怎么知道配置已经生效了呢我们可以用以下命令来查看当前的conda配置conda config --show channels这个命令会列出所有已配置的频道你应该能看到刚才添加的清华镜像源地址出现在列表中。顺序可能有所不同但只要有就行。更直观的方法是查看配置文件。conda的配置文件通常位于你的用户目录下比如C:\Users\你的用户名\.condarc。你可以用记事本打开这个文件看看里面应该包含了类似下面的内容channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ - defaults show_channel_urls: true看到这个就说明换源大功告成了。这里有个细节defaults频道是conda自带的它通常排在最后。这意味着conda会优先从我们添加的清华镜像源里找包找不到才会去defaults也就是官方源这个优先级设置非常合理。4. 安装PyTorch CPU版官网命令的“正确打开方式”环境配置好了高速路也修通了现在终于可以请出主角——PyTorch了。很多教程到这里会直接给你一个安装命令但我认为理解命令从哪里来、为什么这么写同样重要这能让你以后面对其他库时也能举一反三。4.1 访问PyTorch官网获取专属命令没错我们依然需要访问PyTorch官网。这不是多此一举因为官网的安装向导能根据你当前的选择生成最准确、兼容性最好的安装命令。打开浏览器访问https://pytorch.org。你会看到一个非常醒目的“Get Started”区域里面有一个配置选择面板PyTorch Build选择Stable (稳定版)。除非你有特定需求否则稳定版是最省心的选择。Your OS选择你的操作系统比如 Windows、Linux 或 macOS。Package选择Conda。这正是我们一直在准备的包管理器。Language选择Python。注意查看官网推荐的Python版本比如3.8-3.11确保你的Anaconda环境中的Python版本在此范围内。Compute Platform这里就是关键一定要选择CPU。这个选项明确告诉系统我们安装的是不需要CUDA支持的纯CPU版本。当你完成以上选择后官网页面中间会动态生成一行命令大概长这样conda install pytorch torchvision torchaudio cpuonly -c pytorch请注意此时千万不要直接复制这行命令因为末尾的-c pytorch参数意味着“从PyTorch官方频道安装”这会强制conda绕开我们刚刚设置好的清华镜像源又跑去国外下载了。我们辛苦换源就白费了。4.2 改造官网命令让其“本土化”正确的做法是复制官网生成的命令然后果断地删除末尾的-c pytorch。改造后的命令如下conda install pytorch torchvision torchaudio cpuonly对就这么简单。去掉-c参数后conda就会遵循它的默认频道搜索顺序也就是优先从我们配置的清华镜像源里寻找pytorch,torchvision,torchaudio以及cpuonly这些包。cpuonly这个包是一个元包它确保了安装的PyTorch不会包含任何CUDAGPU加速相关的组件非常适合纯CPU环境。4.3 执行安装并享受“飞一般”的速度回到你的Anaconda Prompt确保还在base环境或者你自己创建的某个虚拟环境粘贴上一步改造好的命令按下回车。接下来你会看到conda开始“Solving environment”解析环境。这个过程可能会花几秒到十几秒它是在计算要安装的包及其所有依赖项的最佳版本组合。解析完成后conda会列出所有将要安装、更新或卸载的包并询问你是否继续Proceed ([y]/n)?。输入y并按回车确认。确认之后真正的下载安装就开始了。这时候就是检验我们换源成果的时刻。你应该能看到下载速度非常可观每秒几MB甚至十几MB都是很正常的。原本可能需要数小时甚至因网络超时而失败的安装过程现在通常在一两分钟内就能完成。看着进度条飞速前进那种感觉别提多舒畅了。5. 验证安装与初体验你的第一个PyTorch程序安装进度条走完提示“done”之后我们还需要最后一步来确认PyTorch真的装好了并且能正常工作。5.1 进入Python交互环境验证在Anaconda Prompt中输入python并回车你会进入Python的交互式命令行提示符变为。然后我们依次输入以下三行代码import torch print(torch.__version__) print(torch.cuda.is_available())第一行import torch尝试导入PyTorch库。如果没有报错说明导入成功。第二行print(torch.__version__)打印出已安装的PyTorch版本号。看到像2.0.1这样的输出就说明版本信息正确。第三行print(torch.cuda.is_available())这是关键验证。因为我们安装的是CPU版所以这行代码应该会返回False。这明确告诉我们当前PyTorch没有检测到可用的CUDAGPU它正在以CPU模式运行。这正是我们期望的结果如果这里返回了True那你可能不小心安装了GPU版本。验证无误后输入exit()退出Python交互环境。5.2 创建专属的虚拟环境进阶最佳实践虽然在base环境安装成功了但作为一名有经验的开发者我强烈建议你为每一个项目创建独立的虚拟环境。这就像给你的每个项目一个独立的沙箱里面装的库版本互不影响。比如现在我们来创建一个专门用于学习PyTorch的环境conda create -n pytorch_cpu python3.9这条命令创建了一个名为pytorch_cpu的新环境并指定安装Python 3.9。创建完成后激活这个环境conda activate pytorch_cpu你会发现命令行提示符从(base)变成了(pytorch_cpu)表示你已经进入了这个新环境。然后你只需要在这个环境里重新执行一遍第4步中改造后的安装命令conda install pytorch torchvision torchaudio cpuonly由于conda的配置是全局的我们之前在base环境配的镜像源对所有环境都有效所以在这个新环境里安装PyTorch同样会从清华镜像源高速下载。这样做的好处是你的base环境保持干净所有项目相关的依赖都隔离在各自的环境里管理起来清晰无比。6. 可能遇到的问题与排查技巧即使流程再详细实际操作中也可能遇到一些小波折。这里我分享几个我踩过的坑和解决办法。问题一执行conda install时速度依然很慢或者提示连接错误。排查1检查镜像源配置。再次运行conda config --show channels确认清华源的地址是否正确无误。有时候网络问题可能导致某条添加命令没成功。排查2清理conda缓存。可以尝试运行conda clean -i来清除索引缓存然后重试。有时候旧的缓存信息会干扰。排查3临时使用国内其他源。清华源虽然是国内最流行的但偶尔也可能因为维护或网络问题不稳定。你可以尝试换用北京外国语大学镜像源或阿里云镜像源方法类似只是添加的频道地址不同。问题二安装过程中出现“PackageNotFoundError”错误。原因这通常意味着在当前的频道列表里找不到你指定的包或者包的名称写错了。对于PyTorch CPU版确保命令是conda install pytorch torchvision torchaudio cpuonly并且没有多余的-c参数。解决可以访问https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/这个网址在浏览器里看看目录结构确认里面确实有相应的包文件。问题三验证时import torch失败提示没有名为‘torch’的模块。排查1确认当前环境。你是不是在安装PyTorch的那个环境里用conda activate 环境名切换过去再试。排查2确认安装是否真的成功。在对应环境下运行conda list在输出的列表中查找pytorch、torchvision等看看它们是否在列。配置环境是编程学习的第一步也是最容易让人产生挫败感的一步。我希望这份超详细的指南能帮你把这一步走得稳稳当当。当你看到那个import torch成功执行并且打出第一个tensor([1.])的时候你会发现之前的所有折腾都是值得的。编程的世界很大PyTorch只是其中一扇有趣的门现在门已经打开了期待你在里面创造出有趣的东西。如果在后续使用中遇到其他环境问题不妨多利用conda强大的环境管理功能记住“隔离”和“镜像”这两个法宝能帮你省下大量时间。

相关文章:

快速配置Anaconda清华镜像源安装PyTorch(CPU版)全流程解析

1. 为什么你需要换源?一个真实的故事 我刚开始学深度学习那会儿,装PyTorch这事儿差点把我劝退。那时候啥也不懂,就跟着官网教程,在Anaconda Prompt里输入了那个经典的 conda install pytorch torchvision torchaudio cpuonly -c p…...

架构师视角:达梦数据库CLOB字段写入性能深度调优实战

1. 从一次线上故障说起:CLOB写入为何成了性能瓶颈? 去年我们团队接手了一个内容发布平台的性能优化项目,这个平台每天要处理几十万篇自媒体文章的入库。刚接手时,系统一到晚高峰就频繁告警,数据库响应时间飙升&#xf…...

操作系统原理:优化Baichuan-M2-32B医疗AI系统资源调度

操作系统原理:优化Baichuan-M2-32B医疗AI系统资源调度 1. 医疗AI系统面临的现实调度困境 在医院信息科的实际工作中,我们经常遇到这样的场景:一台配置了RTX 4090显卡的服务器,部署了Baichuan-M2-32B-GPTQ-Int4医疗大模型后&…...

Carsim与Simulink联合仿真:数据后处理实战与效率提升

1. 联合仿真数据后处理:为什么它如此重要? 如果你和我一样,是一名整天和车辆动力学、控制策略打交道的工程师,那你肯定对Carsim和Simulink这对“黄金搭档”不陌生。我们花大量时间搭建模型、调试参数、跑仿真,最终的目…...

使用Xshell管理Qwen-Image-Edit-F2P远程服务器

使用Xshell管理Qwen-Image-Edit-F2P远程服务器 1. 引言 如果你正在运行Qwen-Image-Edit-F2P这样的人脸生成图像模型,很可能需要管理远程服务器。无论是部署在云端的GPU实例,还是本地数据中心的计算节点,稳定高效的远程连接都是确保模型持续…...

解锁AMD Ryzen潜能:SMUDebugTool硬件调试完全指南

解锁AMD Ryzen潜能:SMUDebugTool硬件调试完全指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcod…...

2.46 基于立创梁山派GD32F470的INA226高精度电流电压功率监测模块移植与驱动开发

基于立创梁山派GD32F470的INA226高精度电流电压功率监测模块移植与驱动开发 最近在做一个电池供电的小项目,需要精确监测系统的功耗,找来找去发现了TI的INA226这个芯片。它精度高、使用简单,正好手头有块立创的梁山派开发板(GD32F…...

Qwen2.5-72B-Instruct-GPTQ效果展示:跨语言代码生成与注释翻译

Qwen2.5-72B-Instruct-GPTQ效果展示:跨语言代码生成与注释翻译 最近,一个名为Qwen2.5-72B-Instruct-GPTQ-Int4的模型镜像在开发者社区里引起了不小的讨论。这个模型基于通义千问最新的Qwen2.5系列,经过GPTQ量化到4位精度,并通过v…...

DRAM-Less SSD真的更差吗?HMB技术详解与选购避坑指南

DRAM-Less SSD真的更差吗?HMB技术详解与选购避坑指南 最近帮朋友装机,他盯着购物车里两款价格相差近百元的固态硬盘犯了难:一款是经典的带独立DRAM缓存的型号,另一款则是标注了“DRAM-Less”但支持“HMB”技术的产品。他问我&…...

Spire.Doc 1.6版本License实战指南:从开发到部署的完整流程

1. 为什么你需要关注Spire.Doc 1.6版本的License? 如果你正在用C#或者.NET做Word文档处理,那你大概率听说过或者用过Spire.Doc这个库。它确实是个好东西,能帮你省去大量操作Word文档的底层代码。但很多朋友在项目从开发测试走向正式部署时&am…...

深入解析CAN数据帧:从结构到应用场景

1. CAN数据帧到底是什么?从“汽车神经”说起 如果你拆开过一辆现代汽车,或者看过工业产线的控制柜,里面除了各种机械部件和电线,总少不了几块黑色的盒子,它们之间通过一些看似普通的双绞线连接。这些不起眼的线缆&…...

Oracle19c安装实战:从软件部署到监听配置的完整指南

1. 环境准备:别急着点安装,先把地基打牢 每次看到有朋友一上来就下载Oracle19c的安装包,然后直接双击runInstaller,我心里都捏一把汗。这就像盖房子不打地基,装修完了才发现墙是歪的,到时候再想调整&#x…...

【C++进阶】std::vector性能优化与实战技巧

1. 理解std::vector的性能瓶颈:为什么你的代码会变慢? 很多C开发者,包括我自己,刚开始用std::vector的时候都觉得它就是个“动态数组”,用起来挺顺手。但真正在项目里处理大量数据时,才发现事情没那么简单。…...

MBT:基于多频带迁移的语义分割域自适应新范式

1. 从“水土不服”到“入乡随俗”:为什么语义分割需要域自适应? 大家好,我是老张,在AI和计算机视觉领域摸爬滚打了十几年,做过不少自动驾驶相关的项目。今天想和大家聊聊一个在实际落地时,工程师们几乎百分…...

OpenFeign负载均衡策略深度定制:场景化方案与性能调优

1. 为什么默认的轮询策略不够用?从真实业务场景说起 大家好,我是老张,在微服务这行摸爬滚打十来年了。今天咱们不聊那些高大上的理论,就聊聊一个实实在在的问题:用Spring Cloud做微服务,OpenFeign调服务默认…...

嵌入式硬件实战:嘉立创PCB设计从入门到精通

1. 从零开始:为什么嵌入式开发者必须掌握PCB设计? 很多刚入行的嵌入式软件工程师,或者是从单片机编程转过来的朋友,常常会有一种误解:硬件设计是硬件工程师的事,我只要会写代码、调驱动就行了。我以前也是这…...

OSD IP核的常见报错分析与高效解决方法

1. 从一次深夜报错说起:OSD IP核的“入门杀” 那天晚上,我盯着Vivado里那一串鲜红的报错信息,感觉血压都上来了。项目卡在最后一步,就因为这个OSD(On-Screen Display)IP核死活生成不了。报错信息长得让人头…...

如何通过智能语音识别实现Windows平台的效率革命

如何通过智能语音识别实现Windows平台的效率革命 【免费下载链接】TMSpeech 腾讯会议摸鱼工具 项目地址: https://gitcode.com/gh_mirrors/tm/TMSpeech 在数字化办公日益普及的今天,高效处理语音信息已成为提升工作效率的关键环节。TMSpeech作为一款专为Wind…...

[技术解析] 通用可迁移对抗性后缀:如何攻破对齐大语言模型的安全防线

1. 从“越狱”到“通用攻击”:大模型安全防线的新挑战 不知道你有没有试过,跟ChatGPT或者Claude聊天时,突然问它一个敏感问题,比如“怎么制造危险物品”或者“如何攻击某个网站”。绝大多数时候,这些被精心“对齐”过的…...

nRF5340双核开发实战:从环境搭建到蓝牙例程调试

1. 从nRF52到nRF5340:开发环境的“世界观”转变 如果你和我一样,是从经典的nRF52系列,用着Keil MDK,写着熟悉的C代码一路走过来的,那么第一次接触nRF5340和它的nRF Connect SDK(NCS)时&#xff…...

Ubuntu 22.04 上,从零构建 Isaac Sim 5.1.0 与 Isaac Lab 2.3.0 的 Conda 开发环境

1. 为什么需要一个独立的Conda环境? 如果你刚刚接触机器人仿真或者强化学习,可能会觉得直接在自己的电脑上安装各种软件包不就行了?我以前也是这么想的,直到我的系统环境被各种不同版本的Python和库搞得一团糟,一个项目…...

Synopsys DC 综合实战:从RTL到门级网表的优化之旅

1. 从RTL到GDSII:为什么综合是关键一步? 如果你刚接触数字芯片设计,可能会觉得从写Verilog代码到最终芯片生产,中间隔着一座大山。这座大山里,有一个环节至关重要,它决定了你写的“想法”(RTL代…...

点云数据处理实战:PCL与CloudCompare双引擎驱动下的格式互转方案

1. 为什么你需要一个双引擎的点云格式转换方案? 刚接触点云处理的朋友,可能觉得格式转换不就是“另存为”吗?用个软件打开再保存不就行了?我刚开始也是这么想的,直到在实际项目中踩了几个大坑。比如,一个三…...

LFM2.5-1.2B-Thinking快速部署教程:Ollama开箱即用,无需conda环境

LFM2.5-1.2B-Thinking快速部署教程:Ollama开箱即用,无需conda环境 你是不是曾经被复杂的AI模型部署搞得头疼?需要安装conda、配置环境、解决各种依赖问题,光是准备工作就要花上大半天时间。现在有个好消息:LFM2.5-1.2…...

从仿真到实战:在快马平台构建平衡小车pid控制项目,模拟真实控制场景

最近在琢磨PID控制算法,想找个能直观看到效果、还能动手调参的练习项目。理论看了不少,但总觉得隔着一层,直到我尝试用仿真来模拟一个经典场景:两轮自平衡小车。这玩意儿在无人机、机器人里太常见了,核心就是靠PID让摇…...

快马平台一键生成jmeter性能测试脚本,快速原型验证接口并发能力

最近在做一个新项目的性能评估,需要快速验证几个核心接口在高并发下的表现。以前用JMeter写测试脚本,总得手动配置线程组、采样器、监听器,虽然功能强大,但准备阶段还是挺花时间的。这次我尝试了一个新思路,用InsCode(…...

基于STM32G0B1的立创开源隔离式RS485-CAN通讯监测器设计与实现

基于STM32G0B1的立创开源隔离式RS485-CAN通讯监测器设计与实现 最近在做一个工业现场的数据采集项目,需要同时监听RS485和CAN总线上的数据。市面上的成品要么功能单一,要么价格不菲。于是,我决定自己动手设计一个。这个项目最终做成了一块集成…...

抖音直播下载工具:从内容流失到价值留存的全流程解决方案

抖音直播下载工具:从内容流失到价值留存的全流程解决方案 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 问题发现:直播内容管理的五大核心痛点 在数字内容爆炸的时代,抖…...

cv_resnet50_face-reconstruction模型多视角重建技术详解

cv_resnet50_face-reconstruction模型多视角重建技术详解 1. 引言 你有没有想过,用几张不同角度的自拍照就能生成一个逼真的3D人脸模型?这听起来像是科幻电影里的场景,但现在已经成为了现实。今天我们要聊的cv_resnet50_face-reconstructio…...

【无线通信】谐波抑制实战:从理论到解决方案

1. 谐波:无线通信中的“不速之客” 大家好,我是老张,在无线通信和射频硬件这块摸爬滚打了十几年,调试过的板子、抓过的波形不计其数。今天想和大家聊聊一个几乎在每个项目中都会遇到的“老朋友”——谐波。这东西就像是你精心准备…...