目录
2. 分析问题——常规site-packages文件夹不可写
2.1 修改第三方软件包安装路径的权限(有效,但要准确操作)
1. 提出问题——python软件包无法安装到常规路径
接上回,解决了setuptools的编译warning后。
又遇到了软件包无法安装到常规路径的问题。
异常提示发生在使用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环境的第三方软件安装路径。
希望对你有所帮助。