本文主要是要能通过.pth 文件来填加自己的python包位置,本质是修改site-packages内容。
1 应用场景
系统中己从源码安装好opencv,tensorrt和tensorflow,现在创建一个conda虚拟环境,或使用conda base环境,conda 环境Python版本与系统完全一样。
conda activate base
conda install python==3.8.5 # 安装与系统完全一样的版本
2 查看系统和虚拟环境的python环境变量
有两种方法,第一种:
import sys
print(sys.path)
输出是一个列表:
['', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload', '/usr/local/lib/python3.8/dist-packages', '/usr/lib/python3/dist-packages']
第二种方法:
python -m -site
要注意的是图中sys.path /root
是当前路径
接着查看虚拟环境的:
对比系统和虚拟环境中的sys.path完全不一样,所以要想在虚拟环境中使用系统的python包,要将系统环境添加到虚拟环境中。
3 查找目标路径
找到所有的环境变量后,进入到conda虚拟环境中,以opencv 为例:
conda activate base
python
import cv2
报错ModuleNotFoundError
,所以要找到opencv的安装位置。
查找方法有两个.
第一种:
find / -name cv2*
图中最后一行是opencv所在路径
第二种:
python
import sys
paths = ['', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload', '/usr/local/lib/python3.8/dist-packages', '/usr/lib/python3/dist-packages']
for p in paths:
try:
sys.path.append(p)
import cv2
print(p)
except:
pass
4 虚拟环境中填加路径
解决报错ModuleNotFoundError
有两种方法,第一种:
# ln -s 源 目标
ln -s /usr/local/lib/python3.8/dist-packages/cv2/python-3.8/cv2.cpython-38-x86_64-linux-gnu.so /opt/conda/lib/python3.8/site-packages/cv2.so
第二种:
也就是本文要写的
vim /opt/conda/lib/python3.8/site-packages/mypackages.pth
文件中填写:/usr/local/lib/python3.8/dist-packages
如果有多个路径,一个路径一行即可。更多关于.pth文件说明请参看链接1 链接2
关于这两种方法,第一种只填加cv2包,第二种会把系统中所有包全部填加。