2026年3月18日晚上九点四十,运维群里发来一张截图。测试机上跑的采集脚本报错,脚本是照着网上文章抄的,一共二十来行。
$ python3 collect.py
Traceback (most recent call last):
File "/home/linai/collect.py", line 3, in <module>
import requests
ModuleNotFoundError: No module named 'requests'
小李说白天装过这个包。登上去看安装记录:
$ pip install requests
Requirement already satisfied: requests in /usr/local/lib/python3.11/site-packages (2.31.0)
装的位置是 python3.11 的 site-packages。再看解释器版本:
$ python3 --version
Python 3.9.16
$ pip --version
pip 23.2.1 from /usr/local/lib/python3.11/site-packages/pip (python 3.11)
两边指向的解释器不是同一个。这台机器上 /usr/bin/python3 是系统自带的 3.9.16,/usr/local/bin/pip 是后来编译 3.11 时一起装的,PATH 里排在前面,敲 pip 走的是它。
中间绕了一段。第一反应是权限,普通用户装的包落到系统目录去了。看了 /usr/local/lib/python3.11/site-packages 的属主,root:root,755,requests 目录确实躺在里面,读得到。又顺手看了 df,根分区还剩 41G,跟磁盘也搭不上。
想让脚本直接换 python3.11 跑,改 shebang 就行。拦住了——脚本里 pandas 用的是老写法,3.11 那边只装了 requests,pandas 在 3.9 的 site-packages 里。一台机器上养两套依赖,后面 cron 一跑就更乱。
改用模块方式调用,让装包和跑脚本落到同一个解释器:
$ python3 -m pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Successfully installed certifi-2024.2.2 charset-normalizer-3.3.2 idna-3.6 requests-2.31.0 urllib3-2.2.1
$ python3 collect.py
2026-03-18 22:07:31 采集完成,写入 1184 条
requests 装进了 /usr/lib/python3.9/site-packages,脚本跑通。
在 /home/linai/.bashrc 末尾加了一行 alias pip=’python3 -m pip’。后来配 crontab 的时候,执行命令写成了 /usr/bin/python3 /home/linai/collect.py,不走 PATH。
参考:Python 官方文档 venv 章节 https://docs.python.org/3/library/venv.html ;pip 关于解释器不一致的 issue https://github.com/pypa/pip/issues/5599

评论(0)