PYTHONPATH的顺序非常重要,不要轻易修改设置~/.bashrc里边的PYTHONPATH.
本文介绍一种方式,在虚拟环境激活的时候开启PYTHONPATH的设置,关闭时候恢复原来的设置,避免冲突。
首先进入您的虚拟环境的目录,找到 etc/conda/activate.d/ 和 etc/conda/deactivate.d/ 目录。
在 activate.d 目录中,创建一个脚本(例如 env_vars.sh):
#!/bin/sh
export OLD_PYTHONPATH=$PYTHONPATH
export PYTHONPATH=/path/to/your/env/python3.8/site-packages/:$PYTHONPATH
在 deactivate.d 目录中,创建一个脚本(例如 env_vars.sh):
#!/bin/sh
export PYTHONPATH=$OLD_PYTHONPATH
unset OLD_PYTHONPATH
这样,每当您激活 audio2 环境时,它会将正确的路径添加到 PYTHONPATH 的前面。当您停用环境时,它会还原原始的 PYTHONPATH。
请确保这两个脚本都是可执行的,您可以使用下边的命令来实现。
chmod +x script_name.sh
以下是发现问题的过程记录:
- PYTHONPATH放在第二位就不起效果吗?必须放在第一位才有效果?
(base) hello@hello-desktop:~$ echo $PYTHONPATH
/usr/local/lib/python3.10/site-packages/:/home/hello/mambaforge/envs/audio2/opencv/lib/python3.8/site-packages/:
(base) hello@hello-desktop:~$ python -c "import cv2; print(cv2.__version__)"
4.6.0
(base) hello@hello-desktop:~$ conda activate audio2
(audio2) hello@hello-desktop:~$ python -c "import cv2; print(cv2.__version__)"
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/usr/local/lib/python3.10/site-packages/cv2/__init__.py", line 181, in <module>
bootstrap()
File "/usr/local/lib/python3.10/site-packages/cv2/__init__.py", line 112, in bootstrap
load_first_config([
File "/usr/local/lib/python3.10/site-packages/cv2/__init__.py", line 109, in load_first_config
raise ImportError('OpenCV loader: missing configuration file: {}. Check OpenCV installation.'.format(fnames))
ImportError: OpenCV loader: missing configuration file: ['config-3.8.py', 'config-3.py']. Check OpenCV installation.
(audio2) hello@hello-desktop:~$
- 确实是只放在第一位才有效果,经过调整顺序之后,可以观察到虚拟环境audio2可以使用opencv,而base环境无法使用opencv.
(base) hello@hello-desktop:~$ echo $PYTHONPATH
/home/hello/mambaforge/envs/audio2/opencv/lib/python3.8/site-packages/:/usr/local/lib/python3.10/site-packages/:
(base) hello@hello-desktop:~$ python -c "import cv2; print(cv2.__version__)"
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/home/hello/mambaforge/envs/audio2/opencv/lib/python3.8/site-packages/cv2/__init__.py", line 181, in <module>
bootstrap()
File "/home/hello/mambaforge/envs/audio2/opencv/lib/python3.8/site-packages/cv2/__init__.py", line 112, in bootstrap
load_first_config([
File "/home/hello/mambaforge/envs/audio2/opencv/lib/python3.8/site-packages/cv2/__init__.py", line 109, in load_first_config
raise ImportError('OpenCV loader: missing configuration file: {}. Check OpenCV installation.'.format(fnames))
ImportError: OpenCV loader: missing configuration file: ['config-3.10.py', 'config-3.py']. Check OpenCV installation.
(base) hello@hello-desktop:~$ conda activate audio2
(audio2) hello@hello-desktop:~$ python -c "import cv2; print(cv2.__version__)"
4.6.0
(audio2) hello@hello-desktop:~$
- . 开启本文介绍的虚拟环境激活和停用设置之后,两个环境都可以使用各自的opencv. 最后的效果:
(base) hello@hello-desktop:~$ conda activate audio2
(audio2) hello@hello-desktop:~$ python -c "import cv2; print(cv2.__version__)"
4.6.0
(audio2) hello@hello-desktop:~$ conda deactivate
(base) hello@hello-desktop:~$ python -c "import cv2; print(cv2.__version__)"
4.6.0
附录:
目前我的配置
- 激活/home/hello/mambaforge/envs/audio2/etc/conda/activate.d
#!/bin/sh
export OLD_PYTHONPATH=$PYTHONPATH
export PYTHONPATH=/home/hello/mambaforge/envs/audio2/opencv/lib/python3.8/site-packages/:$PYTHONPATH
export OLD_LD_LIBRARY_PATH=$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/home/hello/mambaforge/envs/audio2/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/home/hello/mambaforge/envs/audio2/opencv/lib/:$LD_LIBRARY_PATH
- 停用/home/hello/mambaforge/envs/audio2/etc/conda/deactivate.d
#!/bin/sh
export PYTHONPATH=$OLD_PYTHONPATH
unset OLD_PYTHONPATH
export LD_LIBRARY_PATH=$OLD_LD_LIBRARY_PATH
unset OLD_LD_LIBRARY_PATH