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

PyCharm中使用PyInstaller将Python脚本打包成EXE文件完整指南

1. 项目缘起:为什么我们需要把Python脚本变成EXE?

作为一个用Python搞过不少小工具、小脚本的开发者,我猜你肯定遇到过这样的场景:你花了好几天时间,用Python写了一个超级好用的小程序,比如一个自动整理桌面文件的工具,或者一个帮你批量处理Excel表格的脚本。你兴冲冲地想分享给同事或者朋友用,结果对方一打开,要么是满屏的黑色命令行窗口一闪而过,要么就是弹出一堆看不懂的“ModuleNotFoundError”错误。你不得不跟对方解释:“啊,你需要先安装Python,版本最好是3.8以上,然后运行pip install -r requirements.txt,哦对了,这个requirements.txt文件我发给你……” 对方多半会一脸懵,然后客气地说:“算了,太麻烦了。”

这个“麻烦”,就是Python作为解释型语言的天然门槛。它依赖运行环境,对普通用户极不友好。而将.py文件转换成.exe可执行文件,就是为了彻底解决这个问题。一个独立的.exe文件,意味着你可以把它扔到任何一台Windows电脑上,双击就能运行,无需关心Python解释器、第三方库、环境变量这些底层细节。这不仅是程序分发的终点,更是让Python从“开发者玩具”走向“用户工具”的关键一步。

在PyCharm这个强大的IDE里完成这件事,更是顺理成章。我们平时在PyCharm里写代码、调试、运行,环境都是现成的。直接从开发环境出发,完成打包发布,整个工作流是连贯的。市面上虽然有很多打包工具,比如PyInstallercx_FreezeNuitka,甚至还有像GraalVM这样的新秀,但PyInstaller凭借其简单、强大、社区活跃的特点,成为了绝大多数Python开发者的首选,也是我们今天要深入探讨的核心。

2. 打包工具选型:为什么是PyInstaller?

在决定动手之前,我们先花点时间聊聊工具的选择。这就像木匠选刨子,选对了工具,事半功倍。

2.1 主流打包方案横向对比

市面上主流的Python打包方案,大致可以分为以下几类:

工具名称核心原理优点缺点适用场景
PyInstaller将Python解释器、依赖库和你的脚本一起打包成一个独立的可执行文件或文件夹。1.使用极其简单,基本命令一行搞定。
2.跨平台,支持Windows, Linux, macOS。
3.支持单文件模式,生成一个.exe,干净利落。
4.社区生态好,遇到问题容易找到解决方案。
1. 生成的exe文件体积较大,因为包含了Python解释器。
2. 对某些特殊库(如PyQt5、TensorFlow)需要额外配置。
3. 杀毒软件误报率较高
绝大多数桌面小工具、脚本、中小型GUI程序的首选。
cx_Freeze同样是将脚本、解释器和依赖库冻结在一起。1. 设置更灵活,通过setup.py进行精细配置。
2. 对某些库的兼容性可能更好。
1.默认不生成单文件,输出是一个文件夹。
2. 配置相对复杂,对新手不友好。
3. 社区活跃度不如PyInstaller。
需要更复杂打包配置的项目,或者PyInstaller搞不定的情况。
Nuitka将Python代码编译成C语言,再编译成机器码。1.性能有提升,因为是编译型。
2. 生成的可执行文件反编译难度极高,保护源码。
3. 最终文件可能更小(依赖库优化得好)。
1.编译过程极其漫长,复杂项目可能需数十分钟。
2.兼容性问题更多,不是所有Python代码都能完美编译。
3. 使用和调试更复杂。
性能有极致要求,或对代码保护有强需求的商业项目。
GraalVM利用GraalVM的native-image工具,将Python(通过GraalPython)编译成本地镜像。1. 启动速度极快,内存占用低。
2. 可以生成真正的本地代码。
1.生态局限,只支持标准库和部分第三方库。
2. 技术较新,踩坑资料少。
3. 构建环境复杂。
追求极致启动速度的微服务或命令行工具,且所用库都在GraalVM支持列表内。

2.2 锁定PyInstaller:简单即正义

对于标题“使用PyCharm将Python写的程序转换为exe文件”所指向的典型场景——开发者希望快速、可靠地将自己的脚本分发给非技术用户——PyInstaller几乎是唯一且最佳的选择

它的“开箱即用”特性与PyCharm的集成体验完美契合。你不需要为了打包而去学习一套复杂的构建系统(如setuptools的复杂配置),也不需要忍受漫长的编译等待。绝大多数情况下,你只需要在PyCharm的终端里输入一行命令,等待几分钟,一个能直接双击运行的.exe文件就诞生了。这种“所见即所得”的体验,对于快速迭代和分享成果至关重要。

注意:网上那些所谓的“在线py生成exe网站”,强烈不建议用于任何正经项目。你将源码上传到不明服务器,安全和隐私都无法保障,且无法处理复杂的依赖关系。打包必须是本地、可控的操作。

3. 环境准备与PyInstaller安装

工欲善其事,必先利其器。在PyCharm里操作,环境其实已经准备好了大半。

3.1 确认你的PyCharm项目环境

首先,确保你用来打包的Python环境,就是你开发时使用的那个环境。这一点在PyCharm里很容易管理。

  1. 打开你的项目,查看PyCharm右下角。这里会显示当前项目使用的Python解释器,比如Python 3.9 (venv)Python 3.10 (C:\...\python.exe)
  2. 最好使用虚拟环境(Virtual Environment)。虚拟环境能为每个项目隔离依赖,避免全局安装的包互相污染。PyCharm在创建新项目时通常会询问是否创建虚拟环境,如果你之前没创建,现在也可以通过File -> Settings -> Project: <你的项目名> -> Python Interpreter,点击齿轮图标选择Add Interpreter来添加一个新的虚拟环境。
  3. 确保你的项目代码在这个环境下能正常运行。这是打包的前提。

3.2 安装PyInstaller

安装PyInstaller非常简单,我们使用PyCharm内置的终端(Terminal)来完成。这个终端会自动激活你项目当前的虚拟环境。

  1. 在PyCharm底部找到或通过View -> Tool Windows -> Terminal打开终端窗口。你会看到命令行提示符前面可能有(venv)字样,这表示你已经在虚拟环境中了。

  2. 在终端中输入以下命令并回车:

    pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple
    • pip install pyinstaller是安装命令。
    • -i https://pypi.tuna.tsinghua.edu.cn/simple是使用清华大学的镜像源,国内下载速度会快很多。如果你有其他更快的源(如阿里云、腾讯云),也可以替换。
  3. 安装完成后,可以在终端输入pyinstaller --version来验证是否安装成功,它会输出当前的PyInstaller版本号。

3.3 一个常见的“坑”与解决:pip版本过旧

有时,在较旧的环境或系统自带的Python中,可能会因为pip版本过低导致安装失败或后续打包出错。如果你的终端提示一些关于“wheel”或“setup”的警告,可以尝试先升级pip:

python -m pip install --upgrade pip

然后再重新执行安装PyInstaller的命令。

4. 核心实战:使用PyInstaller打包你的脚本

现在进入最核心的环节。假设我们有一个名为my_tool.py的脚本,我们要把它变成my_tool.exe

4.1 基础打包命令与参数详解

最基本的打包命令,只需要指定你的脚本文件路径。在PyCharm终端中,确保你的当前目录是你的项目根目录(通常终端打开就是),然后运行:

pyinstaller my_tool.py

执行这个命令后,PyInstaller会开始分析你的my_tool.py

  1. 分析依赖:它会导入你的脚本,找出所有import的模块。
  2. 收集文件:将Python解释器、依赖的库文件、你的脚本字节码等收集起来。
  3. 生成配置:在项目目录下创建两个新文件夹:builddist
    • build文件夹存放打包过程中的临时文件,可以忽略。
    • dist文件夹里会生成一个以你脚本命名的子文件夹(例如dist/my_tool/),里面包含了所有运行所需的文件,包括一个my_tool.exe
  4. 此时,你可以将整个dist/my_tool/文件夹拷贝到其他没有Python的电脑上运行。

但是,我们更想要的是单个独立的.exe文件,这样分发起来更方便。这就需要用到-F参数:

pyinstaller -F my_tool.py

-F--onefile的缩写,意为“打包成单个可执行文件”。打包完成后,在dist文件夹里,你会直接找到一个my_tool.exe,而不是一个文件夹。

4.2 隐藏命令行窗口(针对GUI程序)

如果你的程序是图形界面(GUI)程序,比如用Tkinter、PyQt5、PySide2等写的,运行时那个黑色的控制台窗口是多余的,甚至会导致程序一闪而过就退出(因为控制台窗口打开后立即关闭)。这时需要使用-w参数:

pyinstaller -F -w my_tool.py

-w--windowed--noconsole的缩写,它会告诉PyInstaller:“这是一个窗口程序,不要给我创建控制台窗口。”

重要心得:对于纯命令行脚本(比如数据处理脚本),不要-w参数,否则你将看不到任何输出,程序会“静默”运行,你无法判断它是否在执行、是否出错。

4.3 添加图标与版本信息

一个专业的exe文件应该有自己的图标,而不是默认的白色窗口图标。使用-i参数可以指定图标:

pyinstaller -F -w -i my_icon.ico my_tool.py

这里my_icon.ico必须是.ico格式的图标文件,放在项目目录下。你可以用在线工具将PNG或JPG图片转换为ICO格式。

更进一步,你还可以为exe文件添加详细的版本信息(如文件描述、公司名、版本号等),这需要先创建一个.spec文件进行高级配置,或者使用--version-file参数指向一个包含版本信息的文本文件。对于初次打包,可以先从图标开始。

4.4 处理复杂依赖与数据文件

PyInstaller的自动依赖分析很强大,但并非万能。以下几种情况需要你手动干预:

  1. 动态导入的模块:如果你的代码里使用了__import__()importlib.import_module()或者通过字符串拼接模块名等方式动态导入模块,PyInstaller在静态分析时可能发现不了它们。你需要通过--hidden-import参数显式告诉它:

    pyinstaller -F --hidden-import pandas._libs.tslibs.np_datetime my_tool.py

    例如,某些Pandas版本就需要这样手动添加隐藏导入。

  2. 包含非Python文件:如果你的程序需要读取外部的配置文件、图片、数据库文件等,这些文件不会自动被打包进去。你需要将它们复制到exe所在的目录,或者使用PyInstaller的--add-data参数。--add-data的格式是源路径;目标路径(在Windows上用分号;,在macOS/Linux上用冒号:)。例如,你有一个config.ini文件在项目根目录,想把它放在exe同目录下:

    pyinstaller -F --add-data "config.ini;." my_tool.py

    打包后,config.ini会被复制到生成的exe文件内部(单文件模式时),在运行时,程序可以通过sys._MEIPASS这个临时路径来访问这些被“冻结”的资源。代码需要相应调整:

    import sys import os def get_resource_path(relative_path): """ 获取资源的绝对路径。打包后,资源位于临时文件夹;开发时,资源位于当前目录。""" if hasattr(sys, '_MEIPASS'): # 运行在打包后的临时环境 base_path = sys._MEIPASS else: # 运行在开发环境 base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) config_path = get_resource_path('config.ini')

5. 高级配置与.spec文件

当你需要更精细地控制打包过程时,命令行参数会显得力不从心。这时就需要用到PyInstaller的规范文件(.spec文件)

5.1 生成与理解.spec文件

运行一次基础的打包命令后(比如pyinstaller my_tool.py),除了builddist,你还会在项目根目录看到一个my_tool.spec文件。这个文件实际上是一个Python脚本,它定义了打包的所有配置。

你也可以直接生成一个spec文件而不打包:

pyinstaller --specpath . --name MyApp my_tool.py

--specpath .指定spec文件生成在当前目录,--name MyApp指定生成的应用名为MyApp(而不是my_tool)。

打开.spec文件,你会看到类似以下的结构:

# -*- mode: python ; coding: utf-8 -*- block_cipher = None a = Analysis( ['my_tool.py'], # 你的主脚本 pathex=[], # 额外的模块搜索路径 binaries=[], # 需要包含的二进制文件(如.dll, .so) datas=[], # 需要包含的数据文件,格式同 --add-data hiddenimports=[], # 隐藏导入,格式同 --hidden-import hookspath=[], # 自定义hook文件路径 hooksconfig={}, # hooks配置 runtime_hooks=[], # 运行时hook excludes=[], # 明确排除的模块 win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False, ) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE( pyz, a.scripts, a.binaries, a.datas, [], name='my_tool', # 生成的exe名称 debug=False, # 是否包含调试信息 bootloader_ignore_signals=False, strip=False, upx=True, # 是否使用UPX压缩(可减小体积) console=True, # 是否显示控制台,对应 -w 参数 icon=None, # 图标路径 disable_windowed_traceback=False, argv_emulation=False, target_arch=None, codesign_identity=None, entitlements_file=None, ) coll = COLLECT(...) # 仅在单文件夹模式(非-F)时存在

最重要的就是AnalysisEXE这两个部分。你可以直接编辑这个.spec文件,添加复杂的配置,然后运行以下命令来基于spec文件打包:

pyinstaller my_tool.spec

注意,这时用的是pyinstaller命令,而不是python命令。

5.2 使用.spec文件解决实际问题

  • 添加大量数据文件:在datas=列表里添加元组,比在命令行用多个--add-data更清晰。
    datas=[('assets/images/*.png', 'assets/images'), ('config/settings.ini', 'config'), ('README.md', '.')],
  • 包含二进制依赖:有些Python库依赖特定的.dll.so文件。如果PyInstaller没自动抓取,你需要手动添加到binaries=列表。
    binaries=[('C:/path/to/some.dll', '.')],
  • 排除不必要的模块以减小体积:如果你知道你的程序绝对用不到某些大型库(比如matplotlib,pandas),可以在excludes=列表里排除它们。但务必小心,确保排除的模块确实不是间接依赖。
    excludes=['matplotlib', 'scipy'],
  • 使用UPX压缩upx=True是默认开启的。UPX是一个可执行文件压缩工具,能显著减小生成的exe体积(有时能小一半)。但如果你的程序被某些杀毒软件误报,尝试关闭UPX(upx=False)有时能解决问题。

6. 打包后的测试、问题排查与优化

生成exe文件只是第一步,确保它在目标机器上能正常运行才是关键。

6.1 基础测试流程

  1. 在开发机测试:首先,就在你的开发电脑上,关闭PyCharm,直接去文件管理器里找到生成的dist/my_tool.exe,双击运行。这能测试在脱离IDE环境下的基础运行情况。
  2. 在“干净”环境测试:这是最重要的一步。找一台没有安装Python和你的项目依赖库的Windows电脑(可以用虚拟机,如VirtualBox安装一个干净的Windows系统),将整个dist文件夹(单文件模式就一个exe)拷贝过去,双击运行。观察是否出现缺失DLL、导入模块失败等错误。

6.2 常见问题与解决方案(踩坑实录)

  • 问题一:运行exe后窗口一闪而过/立即关闭

    • 原因:程序运行时发生错误导致崩溃,而你又使用了-w参数隐藏了控制台,所以看不到错误信息。
    • 排查
      1. 首先,去掉-w参数重新打包,在命令行中运行exe,这样错误信息就会打印在控制台上。
      2. 如果程序逻辑导致正常退出,可以在脚本末尾加上input(“按回车键退出...”)来暂停。
    • 实操技巧:对于GUI程序,一个更好的调试方法是在代码开始时重定向标准输出和错误到文件:
      import sys import os if getattr(sys, 'frozen', False): # 判断是否在打包环境中运行 application_path = os.path.dirname(sys.executable) log_file = open(os.path.join(application_path, 'error.log'), 'w') sys.stdout = log_file sys.stderr = log_file
      这样,即使程序崩溃,错误日志也会写入exe同目录下的error.log文件中。
  • 问题二:ModuleNotFoundError: No module named ‘xxx’

    • 原因:PyInstaller的依赖分析没有找到xxx模块。常见于动态导入、插件式架构或某些库的子模块。
    • 解决
      1. 使用--hidden-import=xxx参数。
      2. 检查是否在代码中使用了try...except ImportError包裹了导入语句,PyInstaller的静态分析会忽略被异常包裹的导入。可以考虑在代码顶部添加一个“虚假”的导入import xxx来“骗过”分析器。
      3. 某些库(如gevent,PyQt5.QtWebEngineWidgets)需要特定的PyInstaller Hook。确保你的PyInstaller是最新版本。如果问题依旧,可以搜索“PyInstaller hook for [库名]”。
  • 问题三:生成的exe文件被杀毒软件误报为病毒

    • 原因:这是PyInstaller打包程序的“老大难”问题。因为PyInstaller的引导加载程序(bootloader)行为(如将自身解压到临时目录、加载动态库)与某些病毒行为相似,触发了一些杀毒软件的启发式扫描。
    • 缓解措施
      1. 使用最新版PyInstaller:开发团队会持续改进引导加载程序以减少误报。
      2. 关闭UPX压缩:在.spec文件中设置upx=False。UPX加壳本身也常被误报。
      3. 代码签名:为你的exe购买并应用有效的代码签名证书(如DigiCert, Sectigo)。这是最根本的解决方案,但需要花钱。
      4. 向杀毒软件厂商提交误报:将你的exe文件提交给误报的杀毒软件厂商(如360、腾讯电脑管家、Windows Defender),申请将其加入白名单。这是一个长期且可能反复的过程。
  • 问题四:文件体积过大

    • 原因:PyInstaller打包了完整的Python解释器和所有依赖库,如果用了numpy,pandas,PyQt5这些“重量级”库,exe轻松上百MB。
    • 优化思路
      1. 使用虚拟环境:确保打包环境是干净的,只安装了项目必需的库。避免将整个site-packages都打进去。
      2. 在.spec中排除无用模块:如前所述,使用excludes
      3. 使用UPX压缩:确保upx=True(需先安装UPX工具,PyInstaller通常会尝试自动使用)。
      4. 考虑换用Nuitka:如果体积是核心痛点,可以评估Nuitka,它通过编译优化,有时能生成更小的二进制文件。
      5. 心理建设:对于小型工具,几十MB到一百多MB在当今的存储环境下是可以接受的。用户体验的“无需安装”比节省几十MB磁盘空间往往更重要。

6.3 进阶:使用PyCharm External Tools简化流程

每次都在终端输入一长串命令有点麻烦。PyCharm允许你将常用命令配置为“外部工具”,一键运行。

  1. 打开File -> Settings -> Tools -> External Tools
  2. 点击+号添加新工具。
    • Name:PyInstaller (One File)
    • Program:$PyInterpreterDirectory$/python(这里指向你的Python解释器)
    • Arguments:-m PyInstaller -F -w –icon=my_icon.ico $FileName$
    • Working directory:$ProjectFileDir$
  3. 点击OK保存。

之后,在项目文件树上右键点击你的主脚本文件,选择External Tools -> PyInstaller (One File),PyCharm就会自动在下方运行工具窗口执行打包命令,非常方便。

7. 从打包到分发:构建完整的发布流程

打包出一个能运行的exe只是完成了技术闭环,要真正交付给用户,还需要考虑更多。

7.1 版本管理与构建脚本

对于需要持续更新的项目,手动打包容易出错。建议创建一个构建脚本,比如build.pybuild.bat,将打包命令、清理旧文件、复制资源等步骤自动化。

一个简单的build.bat(Windows) 示例:

@echo off REM 清理旧的构建文件 rmdir /s /q build rmdir /s /q dist REM 执行打包 pyinstaller -F -w -i icon.ico --add-data "config.ini;." --add-data "assets/*;assets/" main.py echo 打包完成!exe文件在 dist 目录下。 pause

每次需要发布新版本时,只需双击运行这个bat文件即可。

7.2 制作安装包

单个exe文件适合简单工具。对于更复杂的程序,可能需要附带多个文件(如文档、示例数据),或者需要创建开始菜单快捷方式、写入注册表等。这时就需要制作一个安装包。

常用的免费安装包制作工具有:

  • Inno Setup: 脚本驱动,非常灵活强大,是许多开源项目的选择。
  • NSIS (Nullsoft Scriptable Install System): 同样脚本驱动,功能强大。
  • Advanced Installer: 有免费版,图形化界面更友好。

以Inno Setup为例,你需要编写一个.iss脚本文件,指定源文件(你的exe)、安装目录、创建快捷方式等。最终它会生成一个专业的.exe安装程序。

7.3 持续集成/持续部署 (CI/CD)

对于团队项目或需要频繁发布的场景,可以将打包过程集成到CI/CD流水线中(如GitHub Actions, GitLab CI, Jenkins)。每次向主分支推送代码时,自动触发打包流程,生成可执行文件,并可能自动上传到发布页面。这确保了构建环境的一致性和发布流程的自动化。

一个GitHub Actions工作流的简单示例(.github/workflows/build.yml):

name: Build EXE on: push: tags: - 'v*' jobs: build-windows: runs-on: windows-latest steps: - uses: actions/checkout@v3 - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.9' - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt pip install pyinstaller - name: Build with PyInstaller run: | pyinstaller -F -w -i icon.ico main.py - name: Upload artifact uses: actions/upload-artifact@v3 with: name: myapp-windows path: dist/main.exe

这个工作流会在你推送一个类似v1.0.0的标签时触发,在微软提供的Windows虚拟机上自动安装Python、依赖库,用PyInstaller打包,最后将生成的main.exe作为构建产物提供下载。

从在PyCharm里写下一行代码,到最终生成一个用户能轻松双击使用的exe文件,这个过程打通了Python开发的“最后一公里”。它不仅仅是技术操作,更是一种产品思维的体现——让代码的价值得以在更广阔的环境中传递。虽然过程中会遇到各种“坑”,但每解决一个,你对Python程序分发机制的理解就会更深一层。希望这篇超详细的指南,能帮你把这条路走得更加顺畅。

http://www.cnnetsun.cn/news/4056347.html

相关文章:

  • figma-html 网页转 Figma 完整指南:5 步把任意网站变成可编辑设计稿
  • 励志与创新奖励基金申请指南:从策略到价值最大化
  • 免费开源的直播录制软件 Fideo,一个工具帮你把30多个平台的直播永久存进本地
  • Logseq深度使用指南:从双链笔记到知识管理系统的进阶实践
  • Dism++系统优化终极指南:5分钟搞定C盘清理、更新管理与系统备份
  • RPG Maker 游戏解密完整指南:用 RPG Maker Decrypter 提取 rgssad、rgss2a、rgss3a 资源
  • Axure RP 11/10/9 免费中文汉化完整指南:3步装好 axure-cn 中文语言包
  • 数学建模竞赛获奖全解析:从Python建模到论文写作的系统工程
  • Wecom酱完整上手指南:开源免费的企业微信消息推送,3步直达个人微信
  • 计算机数据寻址方式全解析:从原理到实践,掌握程序与硬件对话的底层逻辑
  • 30+个免费Illustrator脚本,把3小时的重复手工活压缩到3分钟
  • 保存RDD到文件:reference-apps大数据导出实战教程
  • Kali Linux虚拟机安装与网络安全入门:从零搭建安全学习环境
  • DHCP协议解析:手机自动联网背后的技术原理
  • 想在 Windows 上顺滑刷 B站?BiliBili-UWP 客户端安装使用全指南
  • Java网络编程核心:TCP/IP协议与NIO底层原理详解
  • Photoshop图层批量导出提速指南:3分钟装好Export Layers To Files Fast
  • 用 iPhone 远程控制 Android 手机:Scrcpy-iOS 是什么、怎么用、以及它的终极玩法
  • 国产网闸技术解析:安全隔离与高效传输的平衡之道
  • Wand-Enhancer免费解锁专业版:手机远程控制游戏修改实操指南
  • if和while是如何被编译的?miniC-hosting可视化JMP与JZ控制流指令
  • BIMP批量图像处理实战:把几百张图的重复劳动压缩到一杯咖啡的时间
  • Wand-Enhancer免费解锁Wand专业版:永久移除2小时限制的完整上手指南
  • 百度网盘Mac版限速破解终极指南:免费解锁SVIP高速下载的完整教程
  • 手机上装 APK 总翻车?试试这个 Windows 开源工具,先解析再安装
  • 把暗影精灵的脾气摸透:OmenSuperHub 从装驱动到解锁DB功耗墙的完整调校手记
  • 不花一分钱解锁WeMod Pro,我连夜实测了一晚上
  • 微信聊天记录备份终极指南:用WeChatMsg把每段对话永久保存
  • SRWE窗口编辑器完整指南:无需重启,实时把任意窗口改成任意分辨率
  • Audacity免费AI音频插件怎么用?三步上手OpenVINO插件搞定音乐分离与语音转文字