经常听见吐槽,把一个爬虫脚本发给同事,信誓旦旦说直接跑就行。结果同事那边报 ModuleNotFoundError,自己这边跑得好好的。
几轮改下来,他的环境从 Python 3.8 升到 3.10,pip 装了一堆库,最后发现是路径里有个中文文件夹……
下面复盘一下整个过程。
到底发生了什么?
脚本在本地跑得飞快,发给同事,他那边一跑:
Traceback (most recent call last): File "analyze.py", line 3, in <module> import pandas as pdModuleNotFoundError: No module named 'pandas'
"你没装 pandas 啊,pip install pandas 就行。"
装完再跑:
Traceback (most recent call last): File "analyze.py", line 1, in <module> from config import API_KEYModuleNotFoundError: No module named 'config'
"我本地有个 config.py 存 API Key……"
折腾了半小时,他的环境终于能跑了,但他看你的眼神已经变了。
为什么炸了?
这个问题太经典了,几乎每个把脚本分享给别人的人都踩过。
根因就四个:
① Python 版本不一样
你用 Python 3.10,同事可能还在用 3.8。
3.10 的 match-case 语法、3.9 的 dict | dict 合并操作,在 3.8 上全是语法错误。
# 你在 3.10 能跑match status: case "ok": print("正常") case _: print("异常")# 同事 3.8 跑到这里直接 SyntaxError
② 库没装 / 版本不一样
你装了 pandas 2.0,同事装的是 pandas 1.3。
API 不兼容,同样的代码行为完全不同。
# pandas 2.0+ 支持df.merge(other, on="id", how="left")# pandas 1.3 没问题,但某些新参数会报 TypeError
更常见的是压根没装,你的环境里一堆库是之前项目装的,你以为人人都有。
③ 路径是绝对路径
# 你的电脑DATA_PATH = "/Users/ningning/Documents/data/sales.csv"# 同事的电脑# 这个路径根本不存在
Windows 和 Mac 的路径分隔符还不一样,/ vs \,又是一层坑。
④ 环境变量 / 配置文件
你本地有 .env 文件存着 API Key,同事没有。
你系统里设了 PYTHONPATH,同事没设。
你觉得理所当然的东西,对别人来说全是隐形依赖。
怎么修?
方法一:用 requirements.txt 锁依赖
pip freeze > requirements.txt
发代码时把这个文件一起发过去,同事一键安装:
pip install -r requirements.txt
但 pip freeze 会导出你环境里所有库,包括很多跟项目无关的。
更干净的做法是手动写:
# requirements.txt(手动写,只列项目需要的)pandas>=2.0requests>=2.28openpyxl>=3.0
方法二:用虚拟环境隔离
别污染系统 Python,每个项目新建一个虚拟环境:
# 创建python -m venv .venv# 激活(Mac/Linux)source .venv/bin/activate# 激活(Windows).venv\Scripts\activate# 装依赖pip install -r requirements.txt
同事拿到你的代码,创建虚拟环境、装依赖,环境跟你一模一样。
方法三:路径别写死
# ❌ 绝对路径DATA_PATH = "/Users/ningning/data/sales.csv"# ✅ 相对路径import osDATA_PATH = os.path.join(os.path.dirname(__file__), "data", "sales.csv")# ✅ 或者用 pathlib(更现代)from pathlib import PathDATA_PATH = Path(__file__).parent / "data" / "sales.csv"
方法四:配置外部化
把 API Key、路径等配置从代码里拿出来:
# ❌ 硬编码API_KEY = "sk-xxxxx"# ✅ 从环境变量读import osAPI_KEY = os.environ.get("API_KEY")if not API_KEY: raise ValueError("请设置环境变量 API_KEY")# ✅ 或者用 .env 文件 + python-dotenvfrom dotenv import load_dotenvload_dotenv()API_KEY = os.environ.get("API_KEY")
方法五:写个 README 说明环境要求
哪怕就三行也行:
## 环境要求- Python 3.9+- pip install -r requirements.txt- 设置环境变量 API_KEY=你的key
防坑清单
分享代码前过一遍:
| 检查项 | 怎么查 |
|---|
| Python 版本兼容? | python --version,确认最低支持版本 |
| 依赖列清楚了? | 有没有 requirements.txt |
| 路径是相对的? | 搜代码里的 /Users、C:\、/home |
| 配置外部化了? | 搜代码里的硬编码字符串(Key、密码、路径) |
| 有 README? | 至少写环境要求和运行步骤 |
一句话总结:你的代码能在你电脑跑,不代表能在任何电脑跑。分享前想一想,换个人拿到这份代码,能不能 3 分钟内跑起来?
写代码的人最容易忽略环境差异,因为你对自己的环境太熟悉了。
评论区聊聊:你把代码发给别人,最离谱的报错是什么?
下期预告:99% 的 Python 新手都分不清的两件事,== vs is / 深拷贝 vs 浅拷贝
Python/ML/DL/大模型都折腾过,坑也踩了不少。