⚙️ 第八章 从源文件到可执行文件
📄 一句话概括

光有代码不够——还要解释器、库目录、搜索路径、环境变量;所以【拷个 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 秒实验

  1. 把你常用程序要依赖的东西列一张清单,看看哪几项最容易被忽略。
  2. 想一想:为什么复制一整个 Python 文件夹到新电脑上,程序有时还是跑不起来。

常见误区

  1. 以为可执行文件是自给自足的。它依赖一整套运行环境。
  2. 遇到【在我机器上是好的】就去猜。应该把依赖清单逐项对比。
自测三问(点开对答案) 1. 运行一个程序至少需要哪几样? —— 本机代码或解释器、库文件所在位置、模块搜索路径、运行参数与环境变量。 2. 【在我机器上是好的】通常是什么原因? —— 两台机器的依赖清单不同:库版本、环境变量或搜索路径有差别。 3. 常见的打包方案有哪些? —— 绿色版把库放一起、安装包把依赖装上、容器或镜像把整个环境打包。

相关笔记