文章目录
环境信息
| 项目 | 值 |
|---|---|
| 系统 | WSL2 + Kali Linux |
| IDE | Trae |
| 项目路径 | /home/creek/Security |
| 虚拟环境路径 | /home/creek/Security/.venv |
| Python 版本 | 3.13 |
一、创建与激活虚拟环境
1.1 创建虚拟环境
cd /home/creek/Security
python3 -m venv .venv
1.2 手动激活
source /home/creek/Security/.venv/bin/activate
激活后 prompt 会显示 (.venv) 前缀:
(.venv) ┌──(creek㉿DESKTOP-4NQP2UG)-[~/Security]
1.3 退出激活
deactivate
二、配置终端自动激活
2.1 核心问题:bash vs zsh
Kali Linux 默认 shell 是 zsh,但不同场景下可能使用不同的 shell:
| 场景 | Shell | 配置文件 |
|---|---|---|
WSL 直接启动 (wsl 命令) | zsh | ~/.zshrc |
| Trae 终端 | 取决于 Trae 配置 | ~/.bashrc 或 ~/.zshrc |
脚本 #!/bin/bash | bash | 不读取 rc 文件 |
bash -i 交互式 | bash | ~/.bashrc |
关键结论:Trae 终端可能使用 bash 或 zsh,因此两个配置文件都需要配置。
2.2 配置 ~/.bashrc
在 ~/.bashrc 的最前面(交互式检查之前)添加:
# Auto-activate project virtual environment (before interactive check for Trae terminal)
if [ -z "$VIRTUAL_ENV" ] && [ -f /home/creek/Security/.venv/bin/activate ]; then
source /home/creek/Security/.venv/bin/activate
fi
重要:这段代码必须放在 case $- in *i*) ;; *) return;; esac 之前,否则非交互式 shell 会直接 return,不会执行激活代码。
~/.bashrc 的交互式检查逻辑:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;; # 非交互式 shell 到这里就返回了
esac
Trae 终端有时以非交互式方式启动 bash,如果激活代码放在 return 之后就不会执行。
2.3 配置 ~/.zshrc
在 ~/.zshrc 的末尾添加:
# Auto-activate project virtual environment
if [ -z "$VIRTUAL_ENV" ] && [ -f /home/creek/Security/.venv/bin/activate ]; then
source /home/creek/Security/.venv/bin/activate
fi
zsh 没有 bash 那样的交互式检查,所以放在末尾即可。
2.4 配置说明
if [ -z "$VIRTUAL_ENV" ] && [ -f /home/creek/Security/.venv/bin/activate ]; then
source /home/creek/Security/.venv/bin/activate
fi
| 条件 | 含义 |
|---|---|
[ -z "$VIRTUAL_ENV" ] | 虚拟环境尚未激活(避免重复激活) |
[ -f .../activate ] | 虚拟环境文件存在 |
两个条件都满足时才执行激活,确保安全。
三、Kali Prompt 对虚拟环境的支持
Kali 的 prompt 配置已经内置了对 $VIRTUAL_ENV 变量的支持,激活后会自动显示环境名称。
zsh prompt(~/.zshrc 第 100 行)
PROMPT=$'%F{%(#.blue.green)}┌──${debian_chroot:+($debian_chroot)─}${VIRTUAL_ENV:+($(basename $VIRTUAL_ENV))─}...'
${VIRTUAL_ENV:+($(basename $VIRTUAL_ENV))} — 如果 $VIRTUAL_ENV 非空,则显示 (basename $VIRTUAL_ENV),即 (.venv)。
bash prompt(~/.bashrc 第 81 行)
PS1=$prompt_color'┌──${debian_chroot:+($debian_chroot)──}${VIRTUAL_ENV:+(\[\033[0;1m\]$(basename $VIRTUAL_ENV)'$prompt_color')}...'
同样的逻辑,激活后 prompt 自动带 (.venv) 前缀。
注意:Kali 的 prompt 配置中设置了 VIRTUAL_ENV_DISABLE_PROMPT=1,这是告诉 Python 的 venv 激活脚本不要修改 prompt(因为 Kali 已经自己处理了)。
四、常见问题排查
4.1 新建终端没有激活
原因 1:Trae 终端使用的是 zsh,但只配置了 .bashrc
解决:同时配置 .zshrc
原因 2:激活代码放在了 .bashrc 的 return 之后
解决:把激活代码移到 case $- in *i*) ;; *) return;; esac 之前
原因 3:$VIRTUAL_ENV 已经被设置(父进程继承了)
解决:检查是否有其他地方设置了该变量
4.2 验证方法
# 测试 bash
bash -i -c 'echo "VIRTUAL_ENV=$VIRTUAL_ENV"'
# 测试 zsh
zsh -i -c 'echo "VIRTUAL_ENV=$VIRTUAL_ENV"'
# 查看当前 shell
echo $SHELL
echo $0
# 查看虚拟环境是否激活
echo $VIRTUAL_ENV
which python
4.3 查看用户默认 shell
grep creek /etc/passwd
输出示例:
creek:x:1000:1000:creek,,,:/home/creek:/bin/zsh
最后一列 /bin/zsh 就是默认 shell。
4.4 切换默认 shell
# 切换为 bash
chsh -s /bin/bash
# 切换为 zsh
chsh -s /bin/zsh
五、完整配置文件参考
~/.bashrc 关键部分
# ~/.bashrc
# Auto-activate project virtual environment (放在最前面)
if [ -z "$VIRTUAL_ENV" ] && [ -f /home/creek/Security/.venv/bin/activate ]; then
source /home/creek/Security/.venv/bin/activate
fi
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
# ... 其余配置 ...
~/.zshrc 关键部分
# ~/.zshrc
# ... 其余配置 ...
# IBus Input Method
if [ -f ~/.input_method ]; then
source ~/.input_method
fi
# Auto-activate project virtual environment (放在末尾)
if [ -z "$VIRTUAL_ENV" ] && [ -f /home/creek/Security/.venv/bin/activate ]; then
source /home/creek/Security/.venv/bin/activate
fi
六、总结
| 步骤 | 操作 |
|---|---|
| 1 | 创建虚拟环境 python3 -m venv .venv |
| 2 | 在 ~/.bashrc 最前面添加自动激活代码 |
| 3 | 在 ~/.zshrc 末尾添加自动激活代码 |
| 4 | 关闭并重新打开终端验证 |
配置完成后,无论是 bash 还是 zsh 终端,打开时都会自动激活虚拟环境,prompt 显示 (.venv) 前缀。

1万+

被折叠的 条评论
为什么被折叠?



