正确做法是用venv/bin/python绝对路径直接调用,不依赖shell激活;Linux/macOS用./venv/bin/python,Windows用.\venv\Scripts\python.exe,避免source失效和PATH污染。

直接用 venv 激活脚本在 shell 里基本无效
因为 source 或 . ./venv/bin/activate 只影响当前 shell 进程,而 shell 脚本默认以子 shell 执行,激活后立刻退出,Python 解释器路径根本没变。你看到 which python 还是系统默认的,pip list 也看不到虚拟环境里的包。
正确做法:用 venv/bin/python 绝对路径直接调用
不用激活,不依赖 shell 环境变量,最稳。假设你的 venv 在 ./myenv:
#!/bin/bash python_path="./myenv/bin/python" $python_path my_script.py $python_path -m pip install requests
-
venv必须已创建且完成pip install(否则缺依赖) - 路径必须写对:
./myenv/bin/python(Linux/macOS),Windows 是.\myenv\Scripts\python.exe - 如果脚本需要读取当前目录下的
requirements.txt,$python_path -m pip install -r requirements.txt可以直接用
想复用 venv 里的 pip 或其他可执行文件?同样走绝对路径
虚拟环境里的所有命令(pip、black、flake8)都在 venv/bin/ 下,别试图用 pip 命令名——它不指向 venv 的那个。
- 错:
pip install --upgrade pip→ 调用系统 pip - 对:
./myenv/bin/pip install --upgrade pip - 对:
./myenv/bin/python -m pip install --user some-tool(加--user仅当需要避免权限问题) - 如果路径太长,可以用
venv_bin="./myenv/bin"变量简化,但别用export PATH临时改——子 shell 不继承,还可能污染后续命令
跨平台兼容要注意 venv 路径和 shebang 冲突
Linux/macOS 用 ./venv/bin/python,Windows 用 .\venv\Scripts\python.exe。如果脚本要多平台运行,别硬编码路径,要么:
立即学习“Python免费学习笔记(深入)”;
- 用
python -m venv创建时统一指定位置,再在脚本里判断uname或cygwin等标识做分支 - 更简单:只在 Linux/macOS 上跑,Windows 用户用 WSL;或干脆让所有人用
python -m venv创建后,把venv目录名固定为.venv,再统一写./.venv/bin/python(CI/CD 场景常见) - 别在 Python 脚本头部写
#!/path/to/venv/bin/python—— 这个 shebang 在 shell 脚本里调用时不会生效,而且路径写死难迁移



















