import #
Python 导入搜索顺序 #
当你启动 Python 时,它会构造一个列表 sys.path
,按从左到右顺序查找模块/包:
- 脚本所在目录
- 或空字符串
''
代表“当前工作目录”- 当你用 python -c “…” 执行命令时
- 或者用 python -m modulename 模块方式运行
- 或者在交互式解释器里直接执行时
- 或空字符串
- PYTHONPATH 环境变量里声明的路径(如果有)
- 标准库路径
- 虚拟环境的 site-packages(…/.venv/lib/pythonX.Y/site-packages)
(vllm) root@lts-4090:/mnt/data1/yewang/study/vllm# cat test.py
import sys
print(sys.path)
(vllm) root@lts-4090:/mnt/data1/yewang/study/vllm# python test.py
['/mnt/data1/yewang/study/vllm', '/root/.local/share/uv/python/cpython-3.12.9-linux-x86_64-gnu/lib/python312.zip', '/root/.local/share/uv/python/cpython-3.12.9-linux-x86_64-gnu/lib/python3.12', '/root/.local/share/uv/python/cpython-3.12.9-linux-x86_64-gnu/lib/python3.12/lib-dynload', '/mnt/data1/yewang/study/vllm/.venv/lib/python3.12/site-packages']
(vllm) root@lts-4090:/mnt/data1/yewang/study/vllm# cd ..
(vllm) root@lts-4090:/mnt/data1/yewang/study# python vllm/test.py
['/mnt/data1/yewang/study/vllm', '/root/.local/share/uv/python/cpython-3.12.9-linux-x86_64-gnu/lib/python312.zip', '/root/.local/share/uv/python/cpython-3.12.9-linux-x86_64-gnu/lib/python3.12', '/root/.local/share/uv/python/cpython-3.12.9-linux-x86_64-gnu/lib/python3.12/lib-dynload', '/mnt/data1/yewang/study/vllm/.venv/lib/python3.12/site-packages']
(vllm) root@lts-4090:/mnt/data1/yewang/study/vllm# python -c "import sys; print(sys.path)"
['', '/root/.local/share/uv/python/cpython-3.12.9-linux-x86_64-gnu/lib/python312.zip', '/root/.local/share/uv/python/cpython-3.12.9-linux-x86_64-gnu/lib/python3.12', '/root/.local/share/uv/python/cpython-3.12.9-linux-x86_64-gnu/lib/python3.12/lib-dynload', '/mnt/data1/yewang/study/vllm/.venv/lib/python3.12/site-packages']
(vllm) root@lts-4090:/mnt/data1/yewang/study/vllm# cd ..
(vllm) root@lts-4090:/mnt/data1/yewang/study# python -c "import sys; print(sys.path)"
['', '/root/.local/share/uv/python/cpython-3.12.9-linux-x86_64-gnu/lib/python312.zip', '/root/.local/share/uv/python/cpython-3.12.9-linux-x86_64-gnu/lib/python3.12', '/root/.local/share/uv/python/cpython-3.12.9-linux-x86_64-gnu/lib/python3.12/lib-dynload', '/mnt/data1/yewang/study/vllm/.venv/lib/python3.12/site-packages']
python -c "import vllm; print(vllm.**file**)"
- 你在仓库根目录 /mnt/data1/yewang/study/vllm 下用 python -c … 测试时,
sys.path[0] == ''
(当前工作目录),第一个被查找的就是仓库根目录,这里恰好有个顶层目录 vllm/(源码包),于是就命中了源码版本,而不是 site-packages 里的已安装版本。 - 跑
examples/offline_inference/basic/basic.py
时,你又是在仓库里运行。多数情况下 sys.path[0] 会是 脚本所在目录(…/examples/offline_inference/basic)。如果环境里 PYTHONPATH 含仓库根、或示例脚本/启动器做了路径注入(把仓库根加进 sys.path),仓库根就会进入前几位,仍然会先命中本地 vllm/。
叶王 © 2013-2024 版权所有。如果本文档对你有所帮助,可以请作者喝饮料。