python库文件查找详解
一、python的包的安装目录(系统级安装)
写在前面的,如果当前的系统安装了好几个python,每个python都会有自己的库搜索路径。
1.当前工作目录
运行 Python 脚本时,脚本所在的目录会被置于 sys.path
列表首位。Python 会优先在这个目录搜索待导入的包和模块。例如,若在 /home/user/projects
目录执行 python3 my_script.py
命令,那 /home/user/projects
即为当前工作目录。
2. Python 标准库目录
Python 标准库是 Python 自带的模块与包集合,其所在目录会被添加到搜索路径。标准库的具体位置取决于 Python 的版本和安装方式。
Python 3 系统级安装:标准库通常位于 /usr/lib/python3.x
目录,其中 x
代表具体的 Python 3 版本号,像 Python 3.8 的标准库就在 /usr/lib/python3.8
。
但是如果系统级安装了两个python,分别是python3.8.10,和python3.8.20,这两个可能公用这个标准库目录。如果是3.8和3.9倒没有这个问题。
3. 第三方包安装目录
第三方包会安装到系统级 Python 环境中,常见目录有 /usr/local/lib/python3.x/dist-packages
或 /usr/lib/python3.x/dist-packages
。前者是使用pip安装,后者是使用apt安装。如果在使用pip安装的时候使用--user参数,那么会被安装到/home/user/.local/lib/python3.x/site-packages这个安装目录下
4.PYTHONPATH
环境变量指定的目录
PYTHONPATH
是一个系统环境变量,你能手动设置它,把自定义目录添加到 Python 搜索路径。不同目录间用冒号(:
)分隔。示例如下:
export PYTHONPATH=/path/to/my/modules:/another/path:$PYTHONPATH
5.查看的工具
(1)查看当前python的搜索路径
python -c "import sys; print('\n'.join(sys.path))"
(2)查看当前指定python下都有哪些包
# 将 /path/to/python 替换为实际的 Python 解释器路径
/path/to/python -m pip list
6.一个示例
yzh@yzh:~/app_all$ python -c "import sys; print('\n'.join(sys.path))"
# 当前的路径没有显示,但是是有的
# PYTHONPATH路径
/opt/ros/noetic/lib/python3/dist-packages
# 标准库路径
/usr/lib/python38.zip
/usr/lib/python3.8
/usr/lib/python3.8/lib-dynload
# 第三方库路径 pip install xxx --user
/home/yzh/.local/lib/python3.8/site-packages
# 第三方库路径 pip install xxx
/usr/local/lib/python3.8/dist-packages
# 第三方库路径 apt install
/usr/lib/python3/dist-packages
注意:在ros中,我有很多功能包,我编译好工作空间之后,刷新环境变量,就会将这些功能包的路径加入到PYTHONPATH中,这样这些功能包中的库文件就可以相互调用。
如:与上面相比多了/home/yzh/app_all/devel/lib/python3/dist-packages这个路径。二这个路径下有adjust_parameter等功能包,既然找到这些功能包的路径,那么就可以相互调用了。值得一提的是,一个比较好的办法就是专门写一个工具功能包,这个功能包里面写一些工具函数,给其他功能包调用。
yzh@yzh:~/app_all$ python -c "import sys; print('\n'.join(sys.path))"/home/yzh/app_all/devel/lib/python3/dist-packages
/opt/ros/noetic/lib/python3/dist-packages
/usr/lib/python38.zip
/usr/lib/python3.8
/usr/lib/python3.8/lib-dynload
/home/yzh/.local/lib/python3.8/site-packages
/usr/local/lib/python3.8/dist-packages
/usr/lib/python3/dist-packages
yzh@yzh:~/app_all$ cd /home/yzh/app_all/devel/lib/python3/dist-packages
yzh@yzh:~/app_all/devel/lib/python3/dist-packages$ ls
adjust_parameter judge_system_pkg mav_planning_msgs mav_system_msgs pose_filter quadrotor_msgs rotors_comm
environment mav_msgs mav_state_machine_msgs plotly_msgs quad_model rosbag_tools rqt_quad_gui
yzh@yzh:~/app_all/devel/lib/python3/dist-packages$
二、miniconda寻找包的路径
1.对于conda 的环境,当激活的时候,查询python 的路径结果如下。如果是base 不回加载(/home/yzh/.local/lib/python3.8/site-packages)。
(yolo_env) yzh@yzh:~$ python -c "import sys; print('\n'.join(sys.path))"
# 自动导入PYTHONPATH路径
/opt/ros/noetic/lib/python3/dist-packages
# 标准库路径
/home/yzh/miniconda3/envs/yolo_env/lib/python38.zip
/home/yzh/miniconda3/envs/yolo_env/lib/python3.8
/home/yzh/miniconda3/envs/yolo_env/lib/python3.8/lib-dynload
# 在默认情况下,Python 解释器启动时,会将用户级别的包安装目录(通常是 #~/.local/lib/pythonX.Y/site-packages,其中 X.Y 代表 Python 版本号)添加到 sys.path 列表#里。这个目录用于存放用户使用 pip install --user 命令安装的第三方包。它把这个也给导入了。不同用##户可能这个路径不同
/home/yzh/.local/lib/python3.8/site-packages
# 这个就是第三方库路径,pip下载的库默认在这里。
/home/yzh/miniconda3/envs/yolo_env/lib/python3.8/site-packages
2.激活环境的默认启动文件和关闭环境的默认恢复文件。
当激活一个conda环境的时候,会自动执行miniconda3/envs/当前环境/etc/conda/activate.d文件夹下创脚本,会自动执行这个脚本。当退出的时候,再miniconda3/envs/当前环境/etc/conda/deactivate.d下创脚本,退出环境时候会自动执行这个脚本。
下面是一个例子:
etc下面没有conda文件夹,后面的文件夹和文件需要自己创建。
(1).创建文件
# 创建激活脚本目录
mkdir -p ~/miniconda3/envs/my_conda_env/etc/conda/activate.d# 创建激活脚本文件
touch ~/miniconda3/envs/my_conda_env/etc/conda/activate.d/set_pythonnousersite.sh# 编辑激活脚本
nano ~/miniconda3/envs/my_conda_env/etc/conda/activate.d/set_pythonnousersite.sh
(2).添加内容
#!/bin/bash
# 保存当前的 PYTHONPATH
export OLD_PYTHONPATH=$PYTHONPATH
# 保存当前的 PYTHONNOUSERSITE
export OLD_PYTHONNOUSERSITE=$PYTHONNOUSERSITE
# 清除 PYTHONPATH
unset PYTHONPATH
# 设置 PYTHONNOUSERSITE
export PYTHONNOUSERSITE=1
echo "Activation script is running. Cleared PYTHONPATH and set PYTHONNOUSERSITE."
(3). 创建停用脚本
# 创建停用脚本目录
mkdir -p ~/miniconda3/envs/my_conda_env/etc/conda/deactivate.d# 创建停用脚本文件
touch ~/miniconda3/envs/my_conda_env/etc/conda/deactivate.d/restore_pythonpath.sh# 编辑停用脚本
nano ~/miniconda3/envs/my_conda_env/etc/conda/deactivate.d/restore_pythonpath.sh
(4).修改停用脚本
#!/bin/bash
# 恢复之前的 PYTHONPATH
if [ -n "$OLD_PYTHONPATH" ]; thenexport PYTHONPATH=$OLD_PYTHONPATH
elseunset PYTHONPATH
fi
# 恢复之前的 PYTHONNOUSERSITE
if [ -n "$OLD_PYTHONNOUSERSITE" ]; thenexport PYTHONNOUSERSITE=$OLD_PYTHONNOUSERSITE
elseunset PYTHONNOUSERSITE
fi
# 删除临时变量
unset OLD_PYTHONPATH
unset OLD_PYTHONNOUSERSITE
echo "Deactivation script is running. Restored PYTHONPATH and PYTHONNOUSERSITE."
通过上面的做法,在启动一个虚拟环境的时候,之后默认加载虚拟环境自己的库文件路径。
三、注意事项
对于PATH这个环境变量,这个环境变量存的是一些可执行文件的路径,使用which python的时候,搜索的就是PATH这个环境变量的路径。它会从前往后找,如果前面的找到了,后面的就不找了。这个坑了我很久,所以当你向PATH加东西的时候,考虑一下加在前面还是加在后面。