📄 一句话概括
光有代码不够——还要解释器、库目录、搜索路径、环境变量;所以【拷个 exe 就能跑】是错觉。
📝 本节和前面几节的关系
8.6 说清了依赖从哪来,这一节把它们列全,回答【为什么换个机器就跑不了】。
一、清单
一个程序要跑起来,至少要有这几样: 本机代码或解释器——真正执行指令的那位。 库文件所在位置——用到的库得能找到。 搜索路径——程序怎么知道去哪儿找模块。 运行参数与环境变量——由调用方和操作系统传进来。
二、少一样都不行
解释器不在——系统直接说【不是内部或外部命令】。 库目录搬走——报【找不到模块】。 搜索路径不对——同样找不到模块。 依赖的环境变量没设——可能撑到一半才报错,这种最难查。 所以【把 exe 拷到别的机器上就能跑】这件事,只在【那个机器上这些条件都满足】时才成立。
三、为什么会有【在我机器上是好的】
这句话的根源就在上面那张清单:两台机器上的清单不一样。 可能是库版本不同、可能是某个环境变量只在你机器上设过、也可能是某个文件恰好在你的搜索路径里。 要排查这类问题,正确的做法是把清单一项项列出来对比,而不是猜。 这也是为什么【把运行环境写下来】比【凭记忆配】重要得多。
四、所以才有那些打包方案
既然依赖是麻烦的来源,那就想办法把依赖一起带上: 打包成绿色版——把用到的库一起放到目录里。 做成安装包——安装时把依赖也装上。 做成容器/镜像——把整个环境一起打包(这就是 7.6 讲的那条路)。 它们的共同点都是:把【运行环境的一部分】也当成程序的一部分来交付。
五、动手 Demo:运行可执行文件需要什么
一个程序要跑起来,光有代码还不够。 把眼前这个 Python 程序依赖的东西列出来看看。
import sys
print("解释器 ", sys.executable)
print("库文件位置", sys.prefix)
print("搜索路径数", len(sys.path), "个")
print("运行参数 ", sys.argv[0])
实跑输出:
--------------------------------------------------------------------
运行可执行文件需要什么
--------------------------------------------------------------------
一个程序要跑起来,**光有代码还不够**。
需要什么 眼前这个 Python 程序对应什么
-----------------------------------------------------------------------------------------------
本机代码或解释器 C:\Users\admin\.workbuddy\binaries\python\envs\default\Scripts\python.exe
库文件所在位置 C:\Users\admin\.workbuddy\binaries\python\envs\default
去哪里找模块 11 个搜索路径
程序的参数 sys.argv[0] = I:\Desktop\自我教学\.workbuddy\scripts\ch27_dev\_d27h.py
外部环境变量 由操作系统传进来
前几项缺任何一样,程序都起不来:
解释器不在 → 系统说【不是内部或外部命令】
库目录搬走 → 【找不到模块】
搜索路径不对 → 同样找不到模块
依赖的环境变量没设 → 运行到一半报错
**所以【把 exe 拷到别的机器上就能跑】其实是个错觉:**
真正要拷的是**它依赖的那一整套运行环境**——这也正是 7.4、7.5 讲的那些办法要解决的问题。
解释器、库目录、搜索路径——少任何一样,程序都起不来。 【在我机器上是好的】的根源,就是两台机器上这份清单不一样。
30 秒实验
- 把你常用程序要依赖的东西列一张清单,看看哪几项最容易被忽略。
- 想一想:为什么复制一整个 Python 文件夹到新电脑上,程序有时还是跑不起来。
常见误区
- 以为可执行文件是自给自足的。它依赖一整套运行环境。
- 遇到【在我机器上是好的】就去猜。应该把依赖清单逐项对比。
自测三问(点开对答案)
1. 运行一个程序至少需要哪几样? —— 本机代码或解释器、库文件所在位置、模块搜索路径、运行参数与环境变量。 2. 【在我机器上是好的】通常是什么原因? —— 两台机器的依赖清单不同:库版本、环境变量或搜索路径有差别。 3. 常见的打包方案有哪些? —— 绿色版把库放一起、安装包把依赖装上、容器或镜像把整个环境打包。- ☐ 下一节(8.8 加载时生成的栈和堆)
相关笔记
- DLL文件与导入库 — 动态依赖带来的连带问题
- 加载时生成的栈和堆 — 跑起来之后程序手里有什么
- 使用源代码进行安装 — 依赖问题在安装时的样子
- ⌨️ 编程原理 · 索引 — 把编程全貌理一遍
- ⚙️ 程序是怎样跑起来的 · 索引