安装依赖三方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 分发。
相关推荐
杨充20 小时前
10.可测试性实战设计
设计模式·开源·代码规范
杨充20 小时前
9.重构十二式的实战
设计模式·开源·代码规范
杨充20 小时前
6.设计原则的全景图
设计模式·开源·全栈
杨充20 小时前
2.面向对象的特性
设计模式
杨充20 小时前
7.SOLID原则案例汇
设计模式·开源·全栈
杨充20 小时前
8.反模式与坏味道
设计模式·开源·代码规范
杨充20 小时前
3.接口vs抽象类比较
设计模式
咖啡八杯1 天前
文法、BNF与AST
java·设计模式·解释器模式·ast·文法
咖啡八杯1 天前
GoF设计模式——解释器模式
java·后端·spring·设计模式