安装依赖三方exe/msi的软件设计模式

有些依赖包要安装exe和设置环境变量,但是依赖包本身不能直接运行,还仍需多安装一些msiexe等程序。本文带领大家探索底层原因及其软件设计模式考虑。

1. 核心原因:系统级工具与语言库的分离

许多软件功能并不是用你当前项目所用的编程语言(如 Python、Node.js)编写的,而是用 C、C++、Go、Rust 等系统级语言编写的,并被编译成独立的、可直接被操作系统运行的原生二进制可执行文件

项目代码(例如 Python 脚本)需要去"调用"或"驱动"这个外部工具来完成特定任务。这个过程通常被称为 "子进程调用"

举个例子:

  • FFmpeg :一个强大的音视频处理工具,用 C 语言编写。你的 Python 程序想转换一个视频格式,代码里可能会写 subprocess.run(['ffmpeg', '-i', 'input.mp4', 'output.avi'])。这里,Python 代码只是启动了 ffmpeg.exe 这个外部程序,并传递参数给它,真正的转换工作是由 ffmpeg.exe 完成的。
  • ImageMagick:图像处理套件。
  • wkhtmltopdf:将 HTML 转换为 PDF,使用 Qt WebKit 引擎。
  • 各种编译器/解释器 :如 javac(Java)、gcc(C/C++)、node(JavaScript)本身。
  • 数据库客户端 :如 mysql.exepsql.exe(PostgreSQL)。

用同语言编写
Pillow Python
pdfkit Python 包装器
语言内置库
用系统级语言编写
FFmpeg C/C++
ImageMagick C
wkhtmltopdf C++/Qt
编译器 gcc/clang
数据库客户端
调用方式
subprocess.run

child_process.spawn

等子进程调用
你的应用程序

如 Python/Node.js 项目
目标工具类型
已编译的

二进制可执行文件

.exe/.bin
源代码/字节码

在解释器中运行
直接由操作系统执行
由语言运行时解释执行
高性能

系统级资源访问
易于集成

但可能有性能限制

2. 需要安装和设置exe/msi环境变量的原因

安装(通常是 .exe 或 .msi 文件):

这是将那个独立的、编译好的二进制可执行文件(以及它可能依赖的库文件、配置文件等)放置到你电脑的特定目录(如 C:\Program Files\SomeTool\)的过程。闭源软件几乎总是以这种形式分发。

设置环境变量(主要是 PATH):

操作系统(如 Windows)的 PATH 环境变量是一个目录列表。当你在命令行或代码中只输入一个命令名(如 ffmpeg)时,系统会按照 PATH 中列出的目录顺序,去这些目录里寻找同名的可执行文件。

  • 如果没有设置 PATH :你每次调用都必须使用完整的绝对路径,例如 C:\Program Files\ffmpeg\bin\ffmpeg.exe -i ...,这非常繁琐且代码不可移植。
  • 设置 PATH :你只需输入 ffmpeg,系统就能在 PATH 包含的 C:\Program Files\ffmpeg\bin\ 目录下找到它。这使得命令行操作和程序调用变得简洁通用。

安装与设置环境变量的作用


用户想要运行程序
程序在PATH中吗
直接输入命令名即可运行

例如: ffmpeg
必须输入完整路径

例如: C:\Program Files\ffmpeg\bin\ffmpeg.exe
安装exe/msi
将文件复制到系统目录

如 C:\Program Files\SomeTool
设置PATH环境变量
将程序所在目录

添加到系统搜索列表

3. 闭源 vs 开源

  • 闭源可执行文件(.exe) :这是商业软件或某些特定工具常见的分发方式。开发者不提供源代码,只提供编译后的二进制文件。用户必须直接使用这个 .exe 文件。安装它和设置 PATH 是唯一的使用方式。
    • 例子:许多专业的工业软件、某些游戏的启动器、部分商业SDK中的工具链。
  • 开源可执行文件(.exe) :即使工具本身是开源的(如 FFmpeg、ImageMagick),对于大多数终端用户其他语言的开发者 来说,最方便的方式依然是直接下载官方编译好的、针对自己操作系统(Windows、macOS、Linux)的二进制发布版。自己从源码编译通常很复杂、耗时。
    • 对于 Python 开发者而言,如果这个工具功能被封装成了一个 Python 包装库 (wrapper),则可以通过 pip 安装。但这个 pip 包在背后做的两件关键事情可能就是:
      1. 下载对应平台的预编译二进制文件(或指导你安装)。
      2. 确保这个二进制文件所在的路径能被你的 Python 代码找到(有时通过修改运行时的路径,而非全局 PATH)。

总结与对比

特性 需要安装 .exe 并设 PATH 的依赖 纯语言库依赖(如 pip install requests
本质 独立的系统级程序,用各种语言编写,被编译成原生机器码。 用同种语言编写的库/模块(如纯 Python、纯 JS),在各自的解释器/虚拟机中运行。
分发形式 预编译的二进制可执行文件(.exe, .dmg, .app, .deb 等)。 源代码包(.tar.gz, .whl),由语言自身的包管理器处理。
调用方式 通过操作系统的进程间通信来调用(子进程)。 在语言运行时内部,通过导入(import) 模块,直接调用其函数。
环境变量 必需 (尤其是 PATH),以便系统定位可执行文件。 通常不需要pipnpm 会将库安装到语言自身的已知目录中)。
开源/闭源 两者皆有可能。闭源软件只能以此形式分发。 绝大多数是开源的。闭源的商业库也可能以二进制轮子(.whl)形式通过 pip 分发。
相关推荐
逆境不可逃19 小时前
【从零入门23种设计模式18】行为型之备忘录模式
服务器·数据库·设计模式·oracle·职场和发展·迭代器模式·备忘录模式
Real-Staok19 小时前
(集合)C / C++ 设计模式综合
单例模式·设计模式·代理模式
sg_knight21 小时前
设计模式实战:代理模式(Proxy)
python·设计模式·代理模式·proxy
Anurmy1 天前
设计模式之命令模式
设计模式·命令模式
五点六六六1 天前
基于 AST 与 Proxy沙箱 的局部代码热验证
前端·设计模式·架构
wwdoffice01102 天前
304和316不锈钢有什么区别?哪个更好?
设计模式
网小鱼的学习笔记2 天前
创建型设计模式(工厂、builder、原型、单例)
java·后端·设计模式
逆境不可逃2 天前
【从零入门23种设计模式21】行为型之空对象模式
java·开发语言·数据库·算法·设计模式·职场和发展
蜜獾云2 天前
设计模式之命令模式:给其他模块下达命令
设计模式·命令模式
小湘西3 天前
拓扑排序(Topological Sort)
python·设计模式