无sudo权限在CentOS7上pip3安装Python库遇权限拒绝的解决方法
问题
在CentOS7服务器上搭建Nginx+Gunicorn部署Flask实验室网站,无sudo权限。执行pip3 install相关命令时出现PermissionError: [Errno 13] Permission denied: '/etc'错误,即使使用--user参数也无法解决。之前依赖由root安装,现在无法再使用root账户,需要找到其他安装依赖的方法。
执行pip3 install flask-migrate的报错
(myenv) [abcde@mgWebDB01 user01]$ pip3 install flask-migrate Exception: Traceback (most recent call last): File "/usr/lib/python3.6/site-packages/pip/basecommand.py", line 215, in main status = self.run(options, args) File "/usr/lib/python3.6/site-packages/pip/commands/install.py", line 294, in run with self._build_session(options) as session: File "/usr/lib/python3.6/site-packages/pip/basecommand.py", line 72, in _build_session insecure_hosts=options.trusted_hosts, File "/usr/lib/python3.6/site-packages/pip/download.py", line 329, in __init__ self.headers["User-Agent"] = user_agent() File "/usr/lib/python3.6/site-packages/pip/download.py", line 93, in user_agent from pip._vendor import distro File "/usr/lib/python3.6/site-packages/pip/_vendor/distro.py", line 1050, in <module> _distro = LinuxDistribution() File "/usr/lib/python3.6/site-packages/pip/_vendor/distro.py", line 595, in __init__ self._distro_release_info = self._get_distro_release_info() File "/usr/lib/python3.6/site-packages/pip/_vendor/distro.py", line 984, in _get_distro_release_info basenames = os.listdir(_UNIXCONFDIR) PermissionError: [Errno 13] Permission denied: '/etc' Traceback (most recent call last): File "/usr/bin/pip3", line 16, in <module> sys.exit(main()) File "/usr/lib/python3.6/site-packages/pip/__init__.py", line 247, in main return command.main(cmd_args) File "/usr/lib/python3.6/site-packages/pip/basecommand.py", line 251, in main timeout=min(5, options.timeout)) as session: File "/usr/lib/python3.6/site-packages/pip/basecommand.py", line 72, in _build_session insecure_hosts=options.trusted_hosts, File "/usr/lib/python3.6/site-packages/pip/download.py", line 329, in __init__ self.headers["User-Agent"] = user_agent() File "/usr/lib/python3.6/site-packages/pip/download.py", line 93, in user_agent from pip._vendor import distro File "/usr/lib/python3.6/site-packages/pip/_vendor/distro.py", line 1050, in <module> _distro = LinuxDistribution() File "/usr/lib/python3.6/site-packages/pip/_vendor/distro.py", line 595, in __init__ self._distro_release_info = self._get_distro_release_info() File "/usr/lib/python3.6/site-packages/pip/_vendor/distro.py", line 984, in _get_distro_release_info basenames = os.listdir(_UNIXCONFDIR) PermissionError: [Errno 13] Permission denied: '/etc'
执行pip3 list的输出
(myenv) [abcde@mgWebDB01 user01]$ pip3 list Package Version ------------------ ------- click 8.0.4 dataclasses 0.8 Flask 2.0.3 importlib-metadata 4.8.3 itsdangerous 2.0.1 Jinja2 3.0.3 MarkupSafe 2.0.1 pip 9.0.3 setuptools 39.2.0 typing-extensions 4.1.1 Werkzeug 2.0.3 wheel 0.37.1 zipp 3.6.0 Traceback (most recent call last): File "/usr/bin/pip3", line 16, in <module> sys.exit(main()) File "/usr/lib/python3.6/site-packages/pip/__init__.py", line 247, in main return command.main(cmd_args) File "/usr/lib/python3.6/site-packages/pip/basecommand.py", line 251, in main timeout=min(5, options.timeout)) as session: File "/usr/lib/python3.6/site-packages/pip/basecommand.py", line 72, in _build_session insecure_hosts=options.trusted_hosts, File "/usr/lib/python3.6/site-packages/pip/download.py", line 329, in __init__ self.headers["User-Agent"] = user_agent() File "/usr/lib/python3.6/site-packages/pip/download.py", line 93, in user_agent from pip._vendor import distro File "/usr/lib/python3.6/site-packages/pip/_vendor/distro.py", line 1050, in <module> _distro = LinuxDistribution() File "/usr/lib/python3.6/site-packages/pip/_vendor/distro.py", line 595, in __init__ self._distro_release_info = self._get_distro_release_info() File "/usr/lib/python3.6/site-packages/pip/_vendor/distro.py", line 984, in _get_distro_release_info basenames = os.listdir(_UNIXCONFDIR) PermissionError: [Errno 13] Permission denied: '/etc'
解决方法
1. 升级虚拟环境内的pip到新版本
问题根源是系统pip版本过旧(9.0.3),新版本pip已修复读取/etc目录的权限问题。手动下载安装包在虚拟环境内本地安装:
- 下载pip安装包:
wget https://files.pythonhosted.org/packages/source/p/pip/pip-21.3.1.tar.gz(21.3.1是最后支持Python3.6的版本) - 解压:
tar -xzf pip-21.3.1.tar.gz - 进入目录安装:
cd pip-21.3.1 && python3 setup.py install --user - 退出并重新激活虚拟环境,再执行
pip install flask-migrate
2. 指定安装路径到个人目录
激活虚拟环境后,强制将依赖安装到自己有权限的个人目录:
- 执行安装命令:
pip install --install-option="--prefix=$HOME/.local" flask-migrate - 确保个人bin目录在PATH中:
export PATH="$HOME/.local/bin:$PATH",可将此命令添加到~/.bashrc永久生效
3. 手动下载依赖包本地安装
直接下载依赖的whl包到本地后安装:
- 从PyPI找到flask-migrate及其依赖(如alembic)的whl包链接,用wget下载:
wget https://files.pythonhosted.org/packages/.../Flask_Migrate-3.1.0-py2.py3-none-any.whl(替换为对应版本的链接) - 执行本地安装:
pip install Flask_Migrate-3.1.0-py2.py3-none-any.whl
4. 设置环境变量跳过distro检测
旧版本pip生成User-Agent时会读取/etc目录,设置环境变量可跳过此步骤:
- 执行:
export PIP_USER_AGENT="pip/21.3.1 python/3.6"(版本号可任意填写) - 再执行
pip install flask-migrate
内容的提问来源于stack exchange,提问作者InJae
相关产品推荐
相关产品推荐

