问题 如何在Linux上使用pip为所有用户安装模块?


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

9332
2018-04-27 18:52


起源

什么是输出 python --version 和 pip --version? - Ilya Popov
是的,但是,我不想将它与操作系统分开...... - nowox
@wRAR pip和virtualenv用于完全不同的任务。确实很多人结合使用pip和virtualenv,但我不认为这是正确的 正确 使用。 - wim
@wim,系统软件包会干扰* Nix系统上的pip安装,所以是的,说正确使用Linux,Mac OS X和其他软件(特别是Ubuntu)上的pip是正确的。 。 - Alexander Huszagh
不,这不对。例如,如果您在docker容器中部署应用程序,则需要直接安装到系统。您没有使用virtualenv,因为隔离是由cgroups提供的,您不必担心系统包更改,因为您将容器部署为不可变的。这是一个完全有效的使用pip而不使用virtualenv。 - wim


答案:


你可能有错 umask 设置如讨论 这里

从你上次的编辑,我想你 umask 被设定为 027。试着做

sudo pip uninstall loremipsum
umask 022
sudo pip install loremipsum

14
2018-04-27 20:17



对任何感兴趣的人 umask 是一个设置文件/目录的默认访问权限的命令。查看更多 这里 - Jeremy S.


使用 --target 调用pip时的选项

pip install --target=/your/pyinstalldir loremipsum

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

请注意,每个用户都要正确设置环境,以便目标目录在python路径中可见。

实现这一目标的一种方法是将此目录附加到系统范围的路径变量。例如,创建一个这样的文件

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

2
2018-04-27 19:12