发布于 

python3启动项目环境隔离问题处理

安装依赖报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
mac@macdeMacBook-Pro ai-agent % pip3 install -r requirements.txt

error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try brew install
xyz, where xyz is the package you are trying to
install.

If you wish to install a Python library that isn't in Homebrew,
use a virtual environment:

python3 -m venv path/to/venv
source path/to/venv/bin/activate
python3 -m pip install xyz

If you wish to install a Python application that isn't in Homebrew,
it may be easiest to use 'pipx install xyz', which will manage a
virtual environment for you. You can install pipx with

brew install pipx

You may restore the old behavior of pip by passing
the '--break-system-packages' flag to pip, or by adding
'break-system-packages = true' to your pip.conf file. The latter
will permanently disable this error.

If you disable this error, we STRONGLY recommend that you additionally
pass the '--user' flag to pip, or set 'user = true' in your pip.conf
file. Failure to do this can result in a broken Homebrew installation.

Read more about this behavior here: <https://peps.python.org/pep-0668/>

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.

创建虚拟环境(名字随便,通常叫 venv)

1
python3 -m venv venv

激活虚拟环境

1
source venv/bin/activate

再次安装依赖

1
pip3 install -r requirements.txt

以后每次启动项目,先激活虚拟环境

1
source venv/bin/activate

激活后,命令行前面会多一个 (venv) 提示,说明你在虚拟环境里

1
(venv) mac@macdeMacBook-Pro ai-agent %

然后启动项目

1
python3 main.py

退出虚拟环境命令

1
deactivate

总结

问题来了,对a项目执行了python3 -m venv venv和source venv/bin/activate,这个时候需要安装b项目的依赖和启动b项目,同样在b项目的目录下面执行python3 -m venv venv和source venv/bin/activate,这样操作会和a项目的环境隔离冲突吗?
答案是不会。虚拟环境是独立的,每个虚拟环境都有自己的Python解释器和独立的依赖库。在a项目目录下创建的虚拟环境不会影响b项目目录下创建的虚拟环境。因此,你可以在a项目目录下创建虚拟环境并激活,然后在b项目目录下创建另一个虚拟环境并激活,这样就可以在两个不同的虚拟环境中分别安装和运行a项目和b项目了。
• 每个项目(a、b)都应该有自己的虚拟环境,这样依赖互不干扰。
• 你在 a 项目里建的 venv 只对 a 有效;
• 你在 b 项目里再建一个 venv,只对 b 有效;
• 它们之间完全 隔离,不会冲突。

正确操作流程

1
2
3
4
5
cd a
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
python main.py # 或者对应的启动命令

针对 b 项目

1
2
3
4
5
cd b
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
python app.py # 或者对应的启动命令

注意点
激活虚拟环境时,你只能用 一个环境。
• 如果你已经在 a/venv 里了,再去运行 b 项目,就会报依赖错误。
• 所以要先退出 a 的虚拟环境,再进入 b 的虚拟环境。

如果你不想重复输入 source venv/bin/activate,可以用 工具管理多个虚拟环境,比如:
• pyenv + pyenv-virtualenv
• virtualenvwrapper
这样就能很方便地在不同环境之间切换