如何使用 pip on linux 为所有用户安装模块?

How to install a module for all users with pip on linux?

如何在标准 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

调用 pip 时使用 --target 选项

pip install --target=/your/pyinstalldir loremipsum

目标目录必须是您的用户可写的位置。

请注意,这需要常规用户环境具有 sys.path 中存在的目标目录。实现这一目标的一种可能方法是使用 PYTHONPATH env var:

# /etc/profile.d/myenvvars.sh
export PYTHONPATH=/your/pyinstalldir

您可能有一个错误的 umaskhere

根据你上次的编辑,我猜你 umask 设置为 027。尝试做

sudo pip uninstall loremipsum
umask 022
sudo pip install loremipsum

使用 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 command/row 可以是可选的...,通常 umask 已经是 022,即默认值。

对于 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 的家。