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

清理 pycharm 无效解释器

1. 起因, 目的:

  • 经常使用 pycharm 来调试深度学习项目,每次新建虚拟环境,都是显示一堆不存在的名称,删也删不掉。 总觉得很烦,是个痛点。决定深入研究一下。

请添加图片描述

2. 先看效果

效果是能行,而且清爽多了。请添加图片描述

3. 过程:

下面是 grok 写的的过程总结: 详细过程在这里

清理 PyCharm 无效解释器的探索与修改过程

问题发现

我在 PyCharm CE 2022.3(Win10 系统)中创建新项目时,发现“Base interpreter”下拉菜单里有一堆标着 [invalid] 的 Python 解释器路径,比如 C:\ProgramData\Anaconda3\envs\Pad\python.exe。这些路径对应的环境早已删除,但 PyCharm 还“记着”它们,挺烦人。我决定清理掉这些无效路径。

初步尝试:清理缓存

一开始,我怀疑是 PyCharm 缓存问题。通过 C:\Users\Administrator\AppData\Local\JetBrains\PyCharmCE2022.3\caches 找到了缓存文件,尝试手动删除 caches 文件夹(rmdir /S /Q caches),并在 PyCharm 中用 File > Invalidate Caches / Restart 清理。但无效路径依然存在,说明问题不在缓存。

找到根源:jdk.table.xml

深入研究后,我发现 PyCharm 的解释器配置存储在 C:\Users\Administrator\AppData\Roaming\JetBrains\PyCharmCE2022.3\options\jdk.table.xml。这是一个 XML 文件,包含所有 <jdk> 条目,每个条目记录一个解释器的 namehomePath。无效路径(比如 [invalid])就在这里。

第一次尝试:手动编辑 XML

我用记事本打开 jdk.table.xml,但文件太长,嵌套结构复杂,很难手动找 [invalid] 路径。我需要一个能展开折叠 XML 的工具。

工具选择:VS Code

我选了 VS Code(装了 XML 插件),因为它轻量且支持展开折叠(Ctrl+K Ctrl+J 展开所有)。打开 jdk.table.xml 后,XML 结构清晰了,但手动删除 <jdk> 条目还是太慢,我想用 Python 自动化。

代码 1:解析 XML, 查看全部的 项目名称和路径

我写了一个 Python 脚本,用 xml.etree.ElementTree 解析 XML,提取 <jdk>namehomePath


import xml.etree.ElementTree as ET# 假设我们要解析的 XML 文件路径(改成你自己的文件路径)
# 完整路径是:
# xml_file = r"C:\Users\Administrator\AppData\Roaming\JetBrains\PyCharmCE2022.3\options\jdk.table.xml"
xml_file = r"jdk.table.xml"# 像打开网页一样,解析 XML 文件
tree = ET.parse(xml_file)
root = tree.getroot()  # 得到 XML 的“根节点”,就像 HTML 的 <html># 遍历所有的 <jdk> 标签,就像找 HTML 里的 <div class="item">
for jdk in root.findall('.//jdk'):# 找到 <name> 标签的内容,相当于抓取 HTML 的 <h1> 标题name = jdk.find('name').get('value') if jdk.find('name') is not None else "无名英雄"# 找到 <homePath> 标签的内容,相当于抓取 HTML 的 <a href>home_path = jdk.find('homePath').get('value') if jdk.find('homePath') is not None else "无家可归"# 打印出来,就像把爬到的数据展示在控制台print(f"JDK:{name}")# print(f"路径:{home_path}")# print("--- 分隔线 ---")# print()# 输出结果:
"""
JDK:Python 3.8 (Roll)
JDK:Python 3.8
JDK:Python 3.8 (m4)
JDK:Python 3.8 (Alex)
JDK:Python 3.8 (TF)
JDK:Python 3.8 (Yolo)
JDK:Python 3.8 (Dirty)
JDK:Python 3.8 (del_me)
JDK:Python 3.8 (QT)
JDK:Python 3.8 (PyTorch)
JDK:Python 3.8 (PyCharmLearningProject)
JDK:Python 3.8 (del_me) (2)
JDK:Python 3.8 (Torch)
JDK:Python 3.8 (pythonProject)
JDK:Python 3.8 (CV2)
JDK:Python 3.8 (Traffic)
JDK:Python 3.8 (dedeeee)
JDK:Python 3.8 (TensorFlow-GPU)
JDK:Python 3.8 (SpeechToText)
JDK:Python 3.8 (Start)
JDK:Python 3.8 (del_this)
JDK:Python 3.8 (OpenCV)
JDK:Python 3.8 (My_Spider)
JDK:Python 3.8 (del_this) (2)
JDK:Python 3.8 (del_here)
JDK:Python 2.7 (py27)
JDK:Python 3.8 (del_aaaa)
JDK:Python 3.8 (del)
JDK:Python 3.8 (Porxy_Server)
JDK:Python 3.8 (A)
JDK:Python 3.8 (web)
JDK:Python 3.8 (dek)
JDK:Python 3.6 (Torch_Old_Photo_To_New)
JDK:Python 3.6 (py36)
JDK:Python 3.6 (face)
JDK:Python 3.8 (Pad)
JDK:Python 3.8 (del_later)
JDK:Python 3.8 (del) (2)
JDK:Python 3.8 (delthis)
JDK:Python 3.9 (del_gis)
JDK:Python 3.8 (GSW)
JDK:Python 3.8 (deddd)
JDK:Python 3.8 (dd2)
JDK:Python 3.8 (WNT)
JDK:Python 3.8 (tf_25)
JDK:Python 3.11 (iMac)
JDK:Python 3.8 (Dogg)
JDK:Python 3.11 (pythonProject_del)
JDK:Python 3.8 (Algo)
JDK:altair
JDK:Python 3.8 (torch_tiny)
JDK:Python 3.10 (torch_new)
JDK:Python 3.10 (tf_faceswap)
JDK:Python 3.10 (fa)
JDK:Python 3.10 (Spiders)
JDK:Python 3.10 (OpenCV)
JDK:Python 3.8 (opencv_apps)
JDK:Python 3.10 (nvidia_labs)
JDK:Python 3.10 (del_me)
JDK:Python 3.10 (del_w1)
JDK:Python 3.10 (FakeFace)
JDK:Python 3.10 (My_Spider)
JDK:Python 3.11 (pythonProject)
JDK:Python 3.11 (pythonProject) (2)
JDK:Python 3.11 (del)
JDK:Python 3.7 (del2)
JDK:Python 3.7 (del_33)
JDK:Python 3.10 (littleSpider)
JDK:Python 3.10 (Yolo8)
JDK:Python 3.10 (torch_mxnet)
JDK:Python 3.10 (pyrr)
JDK:Python 3.10 (tf_15)
JDK:Python 3.8 (Utils)
JDK:Python 3.8 (Utils) (2)
JDK:Python 3.10 (Utils)
JDK:Python 3.10 (showMeWhy)
JDK:Python 3.10 (torch_310)
JDK:Python 3.10 (fb_faiss)
JDK:Python 3.10 (SDPA)
JDK:Python 3.10 (transformers_tf)
JDK:Python 3.10 (Explore_Github)
JDK:Python 3.8 (tf_deepface)
JDK:Python 3.8 (venv)
JDK:Python 3.8 (p45)
JDK:Python 3.8 (tf_deepface) (2)
JDK:Python 3.8 (Test_lab)
JDK:Python 3.10 (torch_220)
JDK:Python 3.10 (del)
JDK:Python 3.10 (delddd)
JDK:Python 3.10 (del_me_later)
JDK:Python 3.10 (stable-diffusion-web-app)
JDK:Python 3.10 (torch_210)
JDK:Python 3.10 (torch_201)
JDK:Python 3.10 (torch_112_Transformer)
JDK:Python 3.10 (st)
JDK:Python 3.10 (maybe_del)
JDK:Python 3.10 (djangoShop)
JDK:Python 3.10 (tf_swap_face)
JDK:Python 3.10 (github_io)
JDK:Python 3.10 (ScreenToCode)
JDK:Python 3.10 (QT6)
JDK:Python 3.7 (MoviesRecommend)
JDK:Python 3.8 (redash)
JDK:Python 3.7 (py37)
JDK:Python 3.9 (py39)
JDK:Python 3.7 (python_nlp)
JDK:Python 3.11 (Nuitka_MakeExe)
JDK:Python 3.10 (deldd)
JDK:Python 3.10 (Nuitka_MakeExe2)
JDK:Python 3.7 (tf_115)
JDK:Python 3.10 (torch_212)
JDK:Python 3.7 (tf_1.15)
JDK:Python 3.10 (python_flask_file_server)
JDK:spider
JDK:Python 3.10 (crawler)
JDK:spider (2)
JDK:Python 3.8 (a1)
JDK:Python 3.10 (just_spiders)
JDK:Python 3.10 (streamlit_clould)
JDK:Python 3.10 (QT)
JDK:Python 3.11 (Django_Blog)
JDK:Python 3.8 (d1)
JDK:Python 3.10 (p1)
JDK:Python 3.11 (p2)
JDK:Python 3.11 (honeybot)
JDK:Python 3.11 (d11)
JDK:Python 3.9 (del_later)
JDK:Python 3.11 (shop_app)
JDK:Python 3.9 (PyCharmLearningProject)
JDK:Python 3.10 (torch15)
JDK:Python 3.8 (torch_115)
JDK:voice
JDK:torch_201
JDK:torch_220
JDK:Python 3.10 (torch_113)
JDK:Python 3.10 (torch_1_9)
JDK:Python 3.7 (torch_191)
JDK:Python 3.8 (torch_192)
JDK:Python 3.9 (p39)
JDK:Python 3.11 (python_nlp)
JDK:Python 3.11 (音乐web开发)
JDK:Python 3.11 (music_app)
JDK:Python 3.11 (music_app) (2)
JDK:Python 3.11 (django_rest_api)
JDK:Python 3.11 (dj_basic)
JDK:Python 3.10 (del1111)
JDK:Python 3.10 (r_notebooks)
JDK:Python 3.10 (RR)
JDK:Python 3.10 (dddeledd_me)
JDK:Python 3.10 (RRR)
JDK:Python 3.11 (R3)
JDK:Python 3.11 (Silvia)
JDK:Python 3.11 (Group3Django)
JDK:Python 3.11 (RL)
JDK:Python 3.11 (MakeExe)
JDK:Python 3.8 (venv) (2)
JDK:Python 3.8 (RL_gym_py38)
JDK:Python 3.11 (Mobile_farm_robot_simulation-master)
JDK:Python 3.10 (det2)
JDK:Python 3.11 (smallApps)
JDK:Python 3.11 (face)
JDK:Python 3.9 (face_app)
JDK:Python 3.7 (trafficsign)
JDK:Python 3.10 (seg)
JDK:Python 3.10 (sd)
JDK:Python 3.10 (junk)
"""

运行后,输出了所有解释器名称,比如 Python 3.8 (del_me),但我需要自动删除路径不存在的条目。

代码2:删除不存在的项目。

我加了 os.path.exists 检查路径,并尝试删除无效 <jdk>

import xml.etree.ElementTree as ET
import os# 按照你提供的路径
xml_file = r"jdk.table.xml"# 像打开网页一样,解析 XML 文件
tree = ET.parse(xml_file)
root = tree.getroot()  # 得到 XML 的“根节点”# 存储要删除的 <jdk> 元素和它们的父节点
jdk_to_remove = []# 遍历所有的 <jdk> 标签
for jdk in root.findall('.//jdk'):# 找到 <name> 和 <homePath> 标签的内容name = jdk.find('name').get('value') if jdk.find('name') is not None else "无名英雄"home_path = jdk.find('homePath').get('value') if jdk.find('homePath') is not None else "无家可归"# 打印出来,方便查看print(f"检查 JDK:{name}, 路径:{home_path}")# 检查路径是否存在if not os.path.exists(home_path):print(f"⚠️ 路径 {home_path} 不存在,标记为删除!")# 找到 jdk 的父节点parent = rootfor ancestor in root.iter():for child in ancestor:if child == jdk:parent = ancestorbreakjdk_to_remove.append((jdk, parent))else:print("✅ 路径存在,保留!")print()# 删除标记的 <jdk> 元素
for jdk, parent in jdk_to_remove:parent.remove(jdk)print(f"已删除无效 JDK:{jdk.find('name').get('value') if jdk.find('name') is not None else '无名英雄'}")# 保存修改后的 XML 文件
tree.write(xml_file, encoding="utf-8", xml_declaration=True)
print(f"🎉 清理完成!已保存到 {xml_file}")
print()
最终结果

PyCharm 的解释器列表清爽了,再也没有 [invalid] 路径!


希望对大家有帮助。

相关文章:

清理 pycharm 无效解释器

1. 起因&#xff0c; 目的: 经常使用 pycharm 来调试深度学习项目&#xff0c;每次新建虚拟环境&#xff0c;都是显示一堆不存在的名称&#xff0c;删也删不掉。 总觉得很烦&#xff0c;是个痛点。决定深入研究一下。 2. 先看效果 效果是能行&#xff0c;而且清爽多了。 3. …...

精益数据分析(92/126):指标基准化——如何判断你的数据表现是否足够优秀

精益数据分析&#xff08;92/126&#xff09;&#xff1a;指标基准化——如何判断你的数据表现是否足够优秀 在创业过程中&#xff0c;面对纷繁复杂的指标数据&#xff0c;创业者常常困惑于“什么样的表现算优秀”“我的数据是否达标”。今天&#xff0c;我们将通过WP Engine的…...

手机如何压缩文件为 RAR 格式:详细教程与工具推荐

在如今这个数字化时代&#xff0c;手机已经成为我们生活中不可或缺的工具。随着我们使用手机的频率越来越高&#xff0c;手机中的文件也越来越多&#xff0c;照片、视频、文档等各种类型的文件不断占据着手机的存储空间。 据统计&#xff0c;普通用户的手机存储空间中&#xf…...

Elasticsearch集群管理的相关工具介绍

Elasticsearch 集群管理涉及节点监控、配置管理、故障排查、性能优化等多个环节,依赖一系列官方工具和社区方案实现高效运维。以下从 官方工具链、生态集成工具、社区辅助工具 三个维度介绍核心工具及其应用场景: 一、官方核心工具链 1. Elasticsearch 内置功能 _cluster 接…...

基于多尺度卷积和扩张卷积-LSTM的多变量时间序列预测

时间序列预测是机器学习和数据分析中的重要领域,广泛应用于金融、气象、交通等领域。本文将介绍一种结合多尺度卷积、扩张卷积和LSTM的混合神经网络模型,用于多变量时间序列预测,并提供完整的代码实现和详细讲解。 1. 模型架构概述 我们提出的模型结合了三种强大的神经网络…...

Java 注解式限流教程(使用 Redis + AOP)

Java 注解式限流教程&#xff08;使用 Redis AOP&#xff09; 在上一节中&#xff0c;我们已经实现了基于 Redis 的请求频率控制。现在我们将进一步升级功能&#xff0c;使用 Spring AOP 自定义注解 实现一个更优雅、可复用的限流方式 —— 即通过 RateLimiter 注解&#xf…...

C# XAML 基础:构建现代 Windows 应用程序的 UI 语言

在现代 Windows 应用程序开发中&#xff0c;XAML (eXtensible Application Markup Language) 扮演着至关重要的角色。作为一种基于 XML 的声明性语言&#xff0c;XAML 为 WPF (Windows Presentation Foundation)、UWP (Universal Windows Platform) 和 Xamarin.Forms 应用程序提…...

Linux运维笔记:服务器感染 netools 病毒案例

文章目录 背景排查过程1. 发现异常2. 检测隐藏进程3. 尝试终止进程4. 深入分析进程 处理步骤1. 禁用 Cron 任务2. 删除恶意文件3. 终止恶意进程4. 重启系统 注意事项总结 提示&#xff1a;本文记录了一起 Linux 服务器感染恶意软件&#xff08;疑似挖矿病毒&#xff09;的排查与…...

(面试)获取View宽高的几种方式

Android 中获取 View 宽高的几种方式&#xff0c;以及它们的适用场景和注意事项&#xff1a; 1. View.getWidth() 和 View.getHeight() 原理: 直接从 View 对象中获取已经计算好的宽度和高度。 优点: 简单直接。 缺点: 在 onCreate()、onStart() 等生命周期方法中&#xff0…...

【Linux】进程地址空间揭秘(初步认识)

10.进程地址空间&#xff08;初步认识&#xff09; 文章目录 10.进程地址空间&#xff08;初步认识&#xff09;一、进程地址空间的实验现象解析二、进程地址空间三、虚拟内存管理补充&#xff1a;数据的写时拷贝&#xff08;浅谈&#xff09;补充&#xff1a;页表&#xff08;…...

设计模式——备忘录设计模式(行为型)

摘要 备忘录设计模式是一种行为型设计模式&#xff0c;用于在不破坏封装性的前提下&#xff0c;捕获对象的内部状态并在需要时恢复。它包含三个关键角色&#xff1a;原发器&#xff08;Originator&#xff09;、备忘录&#xff08;Memento&#xff09;和负责人&#xff08;Car…...

吴恩达:构建自动化评估并不需要大量投入,从一些简单快速的示例入手,然后逐步迭代!

吴恩达老师又来信了。 这次他分享了一个重要观点&#xff1a;构建自动化评估并不需要大量投入。从一些简单快速的示例入手&#xff0c;然后逐步迭代&#xff01; 以下是我对原文的翻译&#xff1a; 亲爱的朋友们&#xff1a; 我注意到&#xff0c;许多生成式 AI 应用项目在系…...

鸿蒙OSUniApp内存管理优化实战:从入门到精通#三方框架 #Uniapp

UniApp内存管理优化实战&#xff1a;从入门到精通 在开发 UniApp 应用时&#xff0c;特别是针对鸿蒙设备的开发过程中&#xff0c;内存管理往往成为影响应用性能的关键因素。本文将结合实际项目经验&#xff0c;深入探讨 UniApp 应用的内存优化策略&#xff0c;帮助开发者构建…...

Vue-5-基于JavaScript和plotly.js绘制数据分析类图表

文章目录 1 折线图示例1.1 网页基本结构1.2 绘图流程1.2.1 type图表类型1.2.2 mode显示方式1.2.3 marker数据点的样式1.3 横坐标为时间戳1.3.1 xaxis.type坐标值类型1.3.2 xaxis.tickformat格式1.4 悬停时展示毫秒数2 一个变量2.1 箱线图2.2 小提琴图2.3 直方图3 两个变量3.1 折…...

UI自动化测试的革新,新一代AI工具MidScene.js实测!

前言 AI已经越来越深入地走入我们的实际工作,在软件测试领域,和AI相关的新测试工具、方法也层出不穷。在之前我们介绍过结合 mcp server 实现 AI 驱动测试的案例,本文我们将介绍一个近期崭露头角的国产AI测试工具 Midscene.js Midscene.js简介 MidScene.js 是由字节跳动 w…...

StarRocks的几种表模型

## 一、引言&#xff1a;OLAP场景下的表模型挑战 在实时分析领域&#xff0c;数据表的设计直接影响查询性能、存储效率和更新灵活性。StarRocks作为新一代极速全场景MPP数据库&#xff0c;针对不同的业务场景提供了多样化的表模型解决方案。每种模型通过独特的存储结构和预计算…...

4. Qt对话框(2)

在上节中已经学习了对话框的确认和取消&#xff0c;本节内容继续接上节完成登录对话框实例并得到登录信息。 本文部分ppt、视频截图原链接&#xff1a;[萌马工作室的个人空间-萌马工作室个人主页-哔哩哔哩视频] 1 实现登录对话框 1.1 功能需要 得到登录信息&#xff0c;需要…...

2025-5-31-C++ 学习 字符串(终)

字符串 2025-5-31-C 学习 字符串&#xff08;终&#xff09;P1200 [USACO1.1] 你的飞碟在这儿 Your Ride Is Here题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1 输入输出样例 #2输入 #2输出 #2 说明/提示题解代码 P1597 语句解析题目背景题目描述输入格式输出格式输入…...

Android Studio 2022.2.1.20 汉化教程

查看Android Studio 版本 Android Studio Flamingo | 2022.2.1 Patch 2 下载&#xff1a;https://plugins.jetbrains.com/plugin/13710-chinese-simplified-language-pack----/versions/stable...

第17讲、odoo18可视化操作代码生成模块

1. 模块概述 代码框架生成模块是一个专为Odoo开发者设计的工具&#xff0c;旨在简化模块开发过程中的重复性工作。该模块允许开发者通过定义模型名称和字段&#xff0c;自动生成相应的Python代码、XML视图和CSV权限配置文件&#xff0c;从而大幅提高开发效率。通过这种方式&am…...

golang -- slice 底层逻辑

目录 一、前言二、结构三、创建3.1 根据 make创建3.2 通过数组创建 四、内置append追加元素4.1 追加元素4.2 是否扩容4.2.1 不扩容4.2.2 扩容 总结 一、前言 前段时间学了go语言基础&#xff0c;过了一遍之后还是差很多&#xff0c;所以又结合几篇不同资料重新学习了一下相关…...

SOC-ESP32S3部分:26-物联网MQTT连云

飞书文档https://x509p6c8to.feishu.cn/wiki/IGCawAgqFibop7kO83KcsDFBnNb ESP-MQTT 是 MQTT 协议客户端的实现&#xff0c;MQTT 是一种基于发布/订阅模式的轻量级消息传输协议。ESP-MQTT 当前支持 MQTT v5.0。 特性 支持基于 TCP 的 MQTT、基于 Mbed TLS 的 SSL、基于 WebSo…...

从前端工程化角度解析 Vite 打包策略:为何选择 Rollup 而非 esbuild。

文章目录 前言一、esbuild 与 Rollup 的技术特性对比1、esbuild&#xff1a;极速开发利器&#xff0c;功能尚待完善2、Rollup&#xff1a;专业打包工具&#xff0c;功能全面强大 二、Vite 打包策略的工程化考量因素1、开发阶段与生产阶段的需求差异2、功能完整性与生态兼容性3、…...

三层架构 vs SOA vs 微服务:该选谁?

三层架构 vs SOA vs 微服务:该选谁? 一、从单体到分布式:架构演进的必然性 最早的系统架构通常是单体架构(Monolithic Architecture),所有功能都打包在一个应用里,部署方便,但扩展性和灵活性有限。后来,为了让系统更具可维护性,三层架构成为主流。但当业务变得复杂…...

制造业的未来图景:超自动化与劳动力转型的双重革命

市场现状&#xff1a;传统制造业的转型阵痛 当前全球制造业正站在历史性变革的十字路口。埃森哲对552位工厂经理的全球调研显示&#xff0c;60%的受访者将劳动力转型视为首要战略任务​​&#xff0c;而63%的工厂正在加速部署自动化技术[1]。超过​75%的工厂经理​​认为&…...

使用Haproxy搭建Web群集

一、基础环境准备 服务器规划 67 HAProxy调度器&#xff1a;1台 (2核4G&#xff0c;CentOS 7/8) Web服务器&#xff1a;至少2台&#xff08;如Nginx/Apache&#xff0c;建议192.168.1.101-102&#xff09; 客户端测试机&#xff1a;1台&#xff08;Windows/Linux&#xff09;…...

【Unity】相机 Cameras

1 前言 主要介绍官方文档中相机模块的内容。 关于“9动态分辨率”&#xff0c;这部分很多API文档只是提了一下&#xff0c;具体细节还需要自己深入API才行。 2 摄像机介绍 Unity 场景在三维空间中表示游戏对象。由于观察者的屏幕是二维屏幕&#xff0c;Unity 需要捕捉视图并将…...

如何在 Solana 上发币,并创建初始流动性让项目真正“动”起来?

在 Solana 上发行代币如今已不再是技术门槛&#xff0c;而是市场策略和执行效率的较量。如果你只是简单发了一个代币&#xff0c;却没为它建立流动性和市场机制&#xff0c;那么它就只是一个“死币”。 本文将带你一步步理解&#xff0c;如何从发币到建立流动性池&#xff0c;…...

C++.凸包算法

C.凸包算法 1. 凸包算法概述1.1 凸包的定义1.2 凸包算法的应用场景 2. Graham扫描算法2.1 算法原理2.2 C代码实现2.3 示例分析Mermaid图示 3. Andrew算法3.1 算法原理3.2 C代码实现3.3 示例分析Mermaid图示 4. 算法性能比较4.1 时间复杂度分析Graham扫描算法Andrew算法性能对比…...

C++ 游戏开发详细流程

&#x1f9e0; 第一阶段&#xff1a;项目规划与架构设计 关键词&#xff1a;系统性、模块化、可扩展性 1.1 目标明确 游戏类型&#xff1a;2D / 2.5D / 3D / VR平台选择&#xff1a;PC、主机、移动设备多人/单人&#xff1a;是否含网络模块&#xff08;决定是否使用 socket、U…...