为何Poetry无法加载环境变量?非1.2版本配置问题
解决Poetry 1.2以下版本加载环境变量的问题
核心原因
poetry shell和poetry run不会执行你修改的activate/activate.bat脚本——Poetry启动虚拟环境时是直接调用环境内的Python解释器,跳过了手动激活虚拟环境的脚本执行流程,所以你添加的变量加载逻辑不会生效。
可行解决方案
1. 前置加载环境变量再调用Poetry
直接在执行Poetry命令前先加载creds.sh里的变量,或者封装成别名/批处理:
Bash/Zsh环境:
单次执行:set -a && . ./creds.sh && set +a && poetry shell或者添加别名到shell配置文件(如
~/.bashrc、~/.zshrc),方便复用:alias poetry-shell='set -a && . ./creds.sh && set +a && poetry shell' alias poetry-run='set -a && . ./creds.sh && set +a && poetry run'之后直接用
poetry-shell或poetry-run命令即可带着环境变量启动。Windows CMD环境:
单次执行:for /f "delims== tokens=1,2" %%G in (creds.sh) do set %%G=%%H && poetry shell也可以创建批处理文件(如
poetry-shell.bat):@echo off for /f "delims== tokens=1,2" %%G in (creds.sh) do set %%G=%%H poetry shell
2. 通过Python自定义启动文件自动加载
利用Python的usercustomize.py机制,让虚拟环境的Python启动时自动加载环境变量:
- 进入虚拟环境的
Lib/site-packages目录(Windows下路径类似.venv\Lib\site-packages,Linux/macOS下是.venv/lib/pythonX.X/site-packages) - 创建
usercustomize.py文件,写入以下代码:
之后不管是import os import shlex def load_env_from_sh(file_path): with open(file_path, 'r', encoding='utf-8') as f: for line in f: line = line.strip() if not line or line.startswith('#'): continue if '=' in line: key, value = line.split('=', 1) # 处理带引号的变量值 value = shlex.split(value)[0] if value.strip() else '' os.environ[key.strip()] = value.strip() # 替换为你的creds.sh实际路径,Windows下用双反斜杠或原始字符串 load_env_from_sh('../creds.sh')poetry run还是poetry shell启动的Python进程,都会自动加载这些环境变量。
3. 利用Shell目录自动切换逻辑
在Bash/Zsh的配置文件中添加逻辑,进入项目目录时自动加载环境变量并激活虚拟环境:
在~/.bashrc或~/.zshrc中添加:
cd() { builtin cd "$@" if [ -d .venv ] && [ -f creds.sh ]; then set -a . ./creds.sh set +a source .venv/bin/activate fi }
这样每次进入项目目录时,会自动加载creds.sh的变量并激活虚拟环境,后续执行Poetry命令时变量会自动生效。
内容的提问来源于stack exchange,提问作者DRJ
相关产品推荐
相关产品推荐

