如何在 linux 上为所有使用 pip 的用户安装模块?
Posted
技术标签:
【中文标题】如何在 linux 上为所有使用 pip 的用户安装模块?【英文标题】:How to install a module for all users with pip on linux? 【发布时间】:2016-08-22 06:17:05 【问题描述】:如何在标准 python 环境中安装软件包即 /usr/local/lib/python2.7/dist-packages
使用 pip
并在不使用 virtualenv
的情况下使这个新软件包可供所有用户使用?
通过使用以下内容,软件包仅以 root 权限安装:
$ sudo pip install loremipsum
Downloading/unpacking loremipsum
Downloading loremipsum-1.0.5.tar.gz
Running setup.py (path:/tmp/pip_build_root/loremipsum/setup.py)
egg_info for package loremipsum
Installing collected packages: loremipsum
Running setup.py install for loremipsum
Successfully installed loremipsum
Cleaning up...
证明:
$ python -c 'import loremipsum'
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: No module named loremipsum
$ sudo python -c 'import loremipsum'
$ pip install loremipsum
Requirement already satisfied (use --upgrade to upgrade): loremipsum in
/usr/local/lib/python2.7/dist-packages
Cleaning up...
$ cowsay sad
_____
< sad >
-----
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
请不要建议我改用apt-get install python-...
。我想知道我的错误是什么以及如何正确使用 pip。
$ python --version
Python 2.7.6
$ pip --version
pip 1.5.4 from /usr/lib/python2.7/dist-packages (python 2.7)
$ uname -a
Linux _ 3.19.0-32-generic #37~14.04.1-Ubuntu SMP _ x86_64 GNU/Linux
编辑
我猜这个问题是因为pip
不允许群和大家阅读安装的东西:
$ sudo pip uninstall loremipsum
Uninstalling loremipsum:
/usr/local/lib/python2.7/dist-packages/loremipsum-1.0.5.egg-info
/usr/local/lib/python2.7/dist-packages/loremipsum/__init__.py
/usr/local/lib/python2.7/dist-packages/loremipsum/__init__.pyc
/usr/local/lib/python2.7/dist-packages/loremipsum/default/dictionary.txt
/usr/local/lib/python2.7/dist-packages/loremipsum/default/sample.txt
/usr/local/lib/python2.7/dist-packages/loremipsum/generator.py
/usr/local/lib/python2.7/dist-packages/loremipsum/generator.pyc
Proceed (y/n)? y
Successfully uninstalled loremipsum
$ sudo pip install loremipsum
Downloading/unpacking loremipsum
Downloading loremipsum-1.0.5.tar.gz
Running setup.py (path:/tmp/pip_build_root/loremipsum/setup.py)
egg_info for package loremipsum
Installing collected packages: loremipsum
Running setup.py install for loremipsum
Successfully installed loremipsum
Cleaning up...
$ sudo ls -al /usr/local/lib/python2.7/dist-packages/loremipsum
total 60
drwxr-s--- 3 root staff 4096 Apr 27 22:06 .
drwxrwsr-x 18 root staff 4096 Apr 27 22:06 ..
drwxr-s--- 2 root staff 4096 Apr 27 22:06 default
-rw-r----- 1 root staff 16182 Apr 27 22:06 generator.py
-rw-r----- 1 root staff 16323 Apr 27 22:06 generator.pyc
-rw-r----- 1 root staff 6130 Apr 27 22:06 __init__.py
-rw-r----- 1 root staff 6869 Apr 27 22:06 __init__.pyc
【问题讨论】:
python --version
和 pip --version
的输出是什么?
是的,但是,我不想将它与操作系统分开...
@wRAR pip 和 virtualenv 用于完全不同的任务。确实很多人将pip和virtualenv结合使用,但我认为说那是正确使用是不对的。
@wim,系统包会干扰 *Nix 系统上的 pip 安装,所以是的,说在 Linux、Mac OS X 和其他系统(如 Ubuntu)上正确使用 pip 是正确的, 特别是) 在 virtualenv 中。
不,不是。例如,如果您在 docker 容器中部署应用程序,您希望直接安装到系统中。你没有使用 virtualenv 因为隔离是由 cgroups 提供的,而且你不必担心系统包的变化,因为你将容器部署为不可变的。这是在不使用 virtualenv 的情况下完全有效地使用 pip。
【参考方案1】:
您可能设置了错误的umask
,如讨论的here
从你上次的编辑来看,我猜你 umask
设置为 027
。努力去做
sudo pip uninstall loremipsum
umask 022
sudo pip install loremipsum
【讨论】:
对于任何感兴趣的人,umask
是一个设置文件/目录默认访问权限的命令。查看更多here
感觉像个黑客。这是官方的方式吗?
@robsch 不,看看 Jeremy 的链接。用 umask 检查你的 umask。【参考方案2】:
对于 Ubuntu 18.04,在我的情况下,使用命令 sudo pip install stuff-name
不足以在全局路径中安装模块(它一直在查看本地用户 python 路径) .
我的解决方案
我已更改为 root 用户,并将目录更改为其主目录。然后pip
安装工作正常并在全局路径中安装模块。
详细地,我按照 nowox 的回答做了一个小改动(sudo su
,更改为 root 用户),另请参阅关于 umask 022
的最后说明:
sudo su
cd ~
umask 022
pip install what-you-like
注意:umask 022
命令/行可以是可选的...,通常 umask 已经是 022,这是默认值。
【讨论】:
我今天大部分时间都在试图弄清楚为什么 Flask 可以被我的服务器上的 Python 导入,除非 WSGI 试图导入它。正因为如此。知道为什么pip
现在会在隐藏的本地目录中安装东西吗?
我不知道,抱歉,我从来没有遇到过这个 WSGI,具体,案例。
@DaveTheScientist 也许..也许..这取决于您以运行 Web 服务器的非 root 用户身份运行 pip 的事实?
@F***oTarlao 不,我以其他用户身份运行 pip(具有 sudo 访问权限)。看起来这种行为是 Python 2.6 的标准行为,但对我来说是新的:unix.stackexchange.com/questions/240037/…
哦,是的,这是标准行为,因此我的回答作为第一步使用,sudo su,因为您需要进入超级用户/root 才能安装全局填充系统而不是本地路径(cd ~ 也可能有用)【参考方案3】:
调用 pip 时使用--target
选项
pip install --target=/your/pyinstalldir loremipsum
目标目录必须是您的用户可写的位置。
请注意,这要求常规用户环境在sys.path
中存在目标目录。实现这一目标的一种可能方法是使用PYTHONPATH
env var:
# /etc/profile.d/myenvvars.sh
export PYTHONPATH=/your/pyinstalldir
【讨论】:
为了防止删除之前定义的变量,最好连接 PYTHONPATH:export PYTHONPATH=$PYTHONPATH:/your/pyinstalldir【参考方案4】:对于 Ubuntu 18.04,请尝试 sudo -H pip install loremipsum
。
-H
是--set-home
的缩写:
-H, --set-home
Request that the security policy set the HOME environment variable
to the home directory specified by the target user's password
database entry. Depending on the policy, this may be the default
behavior.
换句话说,这将执行sudo
命令,并将HOME 环境变量设置为root 的家。
【讨论】:
以上是关于如何在 linux 上为所有使用 pip 的用户安装模块?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Mac OS X 上为 Python 3 安装 pip?
如何在 Ubuntu 18 上为 python 3.7 安装 pip?
如何在 Ubuntu 20.04 上为 Python 3.9 安装 pip