玩转ROS2的填坑之路-Defaulting to user installation because normal site-packages is not writeable

目录

1. 提出问题——python软件包无法安装到常规路径

2. 分析问题——常规site-packages文件夹不可写

2.1 修改第三方软件包安装路径的权限(有效,但要准确操作)

2.2 限制软件包仅对当前用户有效(无效)

2.3 构建虚拟环境,并在虚拟环境中安装软件包

3. 解决方法——先查python版本,再准确地修改权限

3.1 查询python版本

3.2 修改文件夹权限

后面的话


1. 提出问题——python软件包无法安装到常规路径

接上回,解决了setuptools的编译warning后。

玩转ROS2的填坑之路-SetuptoolsDeprecationWarning: setup.py install is deprecatedhttps://blog.csdn.net/slampai/article/details/128104802?spm=1001.2014.3001.5501

又遇到了软件包无法安装到常规路径的问题。

异常提示发生在使用pip install安装python软件包时,内容如下:

Defaulting to user installation because normal site-packages is not writeable.

虽然只是一个错误提示,软件依旧可以正常安装,但文件均被放入了临时的路径下,可能会影响ROS2对该软件包的调用。

2. 分析问题——常规site-packages文件夹不可写

2.1 修改第三方软件包安装路径的权限(有效,但要准确操作)

有文章建议:找到当前python环境目录,一般在/usr/local/lib。在里面找到对应的python版本,把里面的dist-packages文件夹的权限全开放即可。

那么,又该如何确定当前所使用的python版本和目录呢?这个放到后面讲。

先假设我们已经知道了当前默认使用python3.10,于是执行如下指令。

sudo chmod 777 /usr/local/lib/python3.10/dist-packages

至此,如果问题解决了,那说明当前python版本确实是3.10。

如果失败了,请接着往下看。

失败的原因其实在于python的包管理路径有多个位置,需要准确地放开我们需要的安装路径。

 Tips:Python安装第三方包的安装路径,有两个:

如果是系统自带的python,会使用dist-packages目录,

通常为/usr/local/lib/<python版本号>/dist-packages/;

如果你手动安装python,它会直接使用目录site-packages,

通常为/usr/local/lib/<python版本号>/site-packages/;

此外,还有一个临时路径。(注:也就是本文开头提到的临时路径)

 ~/.local/lib/<python版本号>/site-packages

对于一些需要检查第三方库路径的情况,在这里可能存在一个坑,导致正常路径下即便存在某个库,但import依旧找不到,只能想办法指向这里的临时库。

2.2 限制软件包仅对当前用户有效(无效)

很抱歉,并没有效果。包括使用sudo,也没有用。

pip install --user <package-name>

2.3 构建虚拟环境,并在虚拟环境中安装软件包

这个思路挺好,但前提是需要先安装一个虚拟环境工具,比如virtualenv。

virtualenv用来创建独立的Python虚拟环境,可以将每个项目与其他项目独立开来,互不影响,解决了依赖包版本冲突的问题。

然后在安装虚拟环境工具时,依然会提示Defaulting to user installation because normal site-packages is not writeable。如果你能忍受这个warning,就可以用此方法愉快地往下进行。

# 安装virtualenv
sudo pip install virtualenv

# 以默认的python创建虚拟环境,名为new_env
virtualenv new_env
# 当系统中存在多个python版本时,选择指定版本的python创建虚拟环境
virtualenv --python /usr/lib/bin/python3.10 new_env

# 默认情况下虚拟环境不会依赖系统环境的site-packages,
# 如果想依赖系统环境的site-packages,可以使用--system-site-packages来设置。
virtualenv --system-site-packages cms

 借助它,可创建出相对独立的python环境,但每次使用前需要手动激活。

# 启动虚拟环境:activate,其中new_env为上一步创建的虚拟环境名称
[...]$ source new_env/bin/activate
(new_env)[...]$

# 退出虚拟环境:deactivate
(new_env)[...]$ deactivate
[...]$

此外,它还有个virtualenv的扩展工具,叫做 virtualenvwrapper,可以方便的创建、删除、复制、切换不同的虚拟环境。安装方法如下:

pip install virtualenvwrapper

virtualenvwrapper功能也更加强大,在virtualenv基础上提供了丰富的命令来操作虚拟环境:

  • 创建虚拟环境:mkvirtualenv [虚拟环境名称]
  • 列出虚拟环境:lsvirtualenv
  • 切换虚拟环境:workon [虚拟环境名称]
  • 查看当前环境安装了哪些包:lssitepackages
  • 进入当前环境的目录:cdvirtualenv [子目录名]
  • 进入当前环境的site-packages目录:cdsitepackages [子目录名]
  • 控制当前环境是否使用global site-packages:toggleglobalsitepackages
  • 复制虚拟环境:cpvirtualenv [source] [dest]
  • 退出虚拟环境:deactivate
  • 删除虚拟环境:rmvirtualenv [虚拟环境名称]

3. 解决方法——先查python版本,再准确地修改权限

比较三种方案,其实如果方法得当,还是第一种更便捷。

总共两步,亲测有效。推荐步骤如下:

3.1 查询python版本

Bash进入python交互模式,输入以下内容:

import sys
print(sys.path)

不出意外,会返回一系列的python路径。

找到以/usr/local/lib/python开头的路径,对应的是当前python环境的第三方软件包安装路径。

在上面截图的例子中,对应路径为 /usr/local/lib/python3.10/dist-packages

3.2 修改文件夹权限

# 请用上一步查询得到的python软件包安装路径
sudo chmod 777 /usr/local/lib/python3.10/dist-packages

至此,问题解决,继续前进。

后面的话

本方法亲测有效。

不同的环境中,第三方软件包的安装路径很可能不同。

若方法无效,请重新确认当前python环境的第三方软件安装路径。

希望对你有所帮助。

猜你喜欢

转载自blog.csdn.net/slampai/article/details/128123964