安装依赖三方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 分发。
相关推荐
希望_睿智13 小时前
实战设计模式之访问者模式
c++·设计模式·架构
茶本无香14 小时前
设计模式之十六:状态模式(State Pattern)详解 -优雅地管理对象状态,告别繁琐的条件判断
java·设计模式·状态模式
驴儿响叮当201014 小时前
设计模式之备忘录模式
设计模式·备忘录模式
驴儿响叮当201014 小时前
设计模式之迭代器模式
设计模式·迭代器模式
qq_4017004114 小时前
嵌入式C语言设计模式
c语言·开发语言·设计模式
SuperEugene14 小时前
常见设计模式在 JS 里的轻量用法:单例、发布订阅、策略
前端·javascript·设计模式·面试
小米49614 小时前
Js设计模式---策略模式
设计模式·策略模式
geovindu15 小时前
python: Strategy Pattern
python·设计模式·策略模式
sg_knight1 天前
适配器模式(Adapter)
python·设计模式·适配器模式·adapter