python -m venv是唯一跨平台、不依赖第三方且与当前python解释器完全对齐的批量建环境方式;需用mkdir原子性判断目录是否存在,windows须用py-3.11显式指定版本,pip路径按平台规则拼写(linux/macos为bin/pip,windows为scripts/pip.exe)。

用 python -m venv 批量建环境最稳
直接调 python -m venv 是唯一跨平台、不依赖第三方、且与当前 Python 解释器完全对齐的方式。别用 virtualenv 或 venvwrapper,它们在多 Python 版本混用时容易绑定错解释器,尤其在 CI 或 Docker 里会悄无声息地创建出 Python 2.7 的空环境(哪怕你敲的是 python3.11)。
批量创建的核心就是循环调命令,但要注意三点:
- 每个
venv目录必须不存在,否则python -m venv默认静默失败(不报错也不覆盖) - 路径不能含空格或 Unicode 控制符,Windows 上尤其要避开中文路径和 OneDrive 同步目录
- 如果目标是不同 Python 版本,得显式指定解释器路径,比如
/opt/python/3.9/bin/python -m venv,不能只靠python3.9别名
shell 脚本里怎么安全判断目录是否已存在
很多人写 if [ ! -d env1 ]; then python -m venv env1; fi,看似没问题,但并发执行时可能两个进程同时通过判断,然后都去建——venv 不做原子锁,第二个会因目录已存在而失败,错误信息是:Error: [Errno 17] File exists: 'env1'。
更稳妥的做法是用 mkdir 的原子性兜底:
for name in app-api app-worker cron-job; do
if mkdir "$name"; then
python -m venv "$name"
else
echo "Skip: $name already exists"
fi
done
这里 mkdir 成功才进 venv 步骤,失败说明目录已被占,跳过即可。比 test -d 多一层竞态保护。
Windows PowerShell 批量建 venv 的坑
PowerShell 默认不把当前目录加进 $env:PATH,所以 python -m venv 可能调到系统级 Python(比如 C:\Python39\),而不是你期望的 py -3.11。
inference.sh 的 Python SDK:运行 AI 应用、构建智能体,并集成 150 多个模型。包名:inferencesh (pip install inferencesh)。支持同步/异步……
必须显式用 py 启动器并指定版本:
foreach ($name in "web", "api", "utils") {
if (-not (Test-Path $name)) {
py -3.11 -m venv $name
}
}
注意:py -3.11 是 Windows 官方启动器语法,python3.11 在 PowerShell 里大概率找不到命令;另外 Test-Path 比 if (!(Get-Item $name -ErrorAction Ignore)) 快得多,后者会触发异常捕获开销。
建完不激活,但要快速知道 pip 路径在哪
批量建完后,你通常不会一个个 source bin/activate,而是直接调用各环境下的 pip 安装包。关键是要准确拼出 pip 路径:
- Linux/macOS:
./env-name/bin/pip - Windows:
.\env-name\Scripts\pip.exe(注意是.exe后缀,不是pip) - 别硬编码
python -m pip——它走的是当前 shell 的 Python,不是 venv 里的
一个通用写法是先查 pyvenv.cfg 确认 base executable,再推导:grep "home =" env-name/pyvenv.cfg | cut -d' ' -f3-,但多数场景直接按平台规则拼更省事。
真正容易被忽略的是:Windows 上 Scripts 目录里还有 pip3.exe 和 python.exe,但它们只是符号链接(实际是硬链接),不要依赖这些名字——pip.exe 才是 venv 保证存在的入口。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










