V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
XIVN1987
V2EX  ›  Python

感觉 Linux 下安装 Python 包不如 windows 下清晰

  •  
  •   XIVN1987 · 2018-11-28 22:14:22 +08:00 · 5873 次点击
    这是一个创建于 2185 天前的主题,其中的信息可能已经有所发展或是发生改变。

    windows 下,不管什么包,都是 pip install,而且都是安装到 site-packages 下,, Linux 下,pip install、sudo pip install、sudo apt install 三种方式,而且安装目录还不一样,,感觉不如 windows 下清晰

    如果都用 pip install 装的话,有些软件执行需要管理员权限又找不到已安装的包 如果都用 sudo pip install 装的话,有时候又可能会忘记用 sudo 了,还得先卸载了再用 sudo pip 重新装一遍,,

    请问各位 Linux 大神怎么安装 Python 的包啊??

    第 1 条附言  ·  2018-11-29 00:04:14 +08:00
    我通过 sys.path 查看了下 python 查找包的位置:
    ``` python
    >>> print('\n'.join(sys.path))
    /usr/lib/python35.zip
    /usr/lib/python3.5
    /usr/lib/python3.5/plat-x86_64-linux-gnu
    /usr/lib/python3.5/lib-dynload
    /home/wmx/.local/lib/python3.5/site-packages
    /usr/local/lib/python3.5/dist-packages
    /usr/lib/python3/dist-packages
    ```

    后期可以安装 package 的地方应该是下面三个位置,
    其中 /home/wmx/.local/lib/python3.5/site-packages 应该是通过 pip install --user 安装的
    /usr/lib/python3/dist-packages 和 /usr/local/lib/python3.5/dist-packages 有什么区别??是不是前者是 sudo apt install 安装的位置,后者是 sudo pip install 的位置?

    另外,sudo pip install 和 pip install --user 的区别我搞清楚了,前者是安装到系统目录,后者是安装到用户目录,,可是 pip install 安装到哪个目录有点儿糊涂

    我之前用 pip install markdown,它把 markdown 安装到用户目录去了。
    然后我升级了 pip,从 9.0 升级到了 18.1,,再次执行 pip install 时它要把包安装到系统目录去,,难道不指定 sudo 和--user 的时候,pip install 的 package 安装位置在不同的 pip 版本中是不同的??
    第 2 条附言  ·  2018-11-29 10:46:19 +08:00
    关于“ pip install xxx ”将包安装到系统目录还是用户目录,,请见 31 楼


    另外我想谈一下我对“ pip install xxx --user ”的理解

    先看下 Python 搜索 package 的路径和顺序

    ``` python
    >>> print('\n'.join(sys.path))

    /usr/lib/python35.zip
    /usr/lib/python3.5
    /usr/lib/python3.5/plat-x86_64-linux-gnu
    /usr/lib/python3.5/lib-dynload
    /home/wmx/.local/lib/python3.5/site-packages
    /usr/local/lib/python3.5/dist-packages
    /usr/lib/python3/dist-packages
    ```

    可知,python 先搜索用户目录,,然后再搜索系统目录,,
    那么就算“ pip install xxx --user ”把包安装到用户目录,不破坏系统目录下系统自带的包,,可是 python 代码执行的时候用的是先搜到的用户目录下的包啊,,这跟系统目录下的包被覆盖效果一样吧,,
    51 条回复    2018-12-02 18:42:33 +08:00
    clino
        1
    clino  
       2018-11-28 22:16:29 +08:00
    我一般创建一个 virtualenv,在里面 pip install 这样比较干净
    xiaoheijw
        2
    xiaoheijw  
       2018-11-28 22:16:31 +08:00
    pyenv
    hhhsuan
        3
    hhhsuan  
       2018-11-28 22:17:50 +08:00 via Android
    pipenv
    XIVN1987
        4
    XIVN1987  
    OP
       2018-11-28 22:21:46 +08:00
    @clino
    全装虚拟环境里??

    好吧,看来虚拟环境是 Linux 下使用 Python 的最佳实践
    greatx
        5
    greatx  
       2018-11-28 22:23:18 +08:00
    保持系统环境干净,平时用到的放到虚拟环境里,不用可以直接删了。
    ericls
        6
    ericls  
       2018-11-28 22:24:19 +08:00 via iPhone
    @XIVN1987 所有项目的东西都装 venv 就跟 npm 似的
    toptyloo
        7
    toptyloo  
       2018-11-28 22:31:15 +08:00   ❤️ 1
    pip install xxx --user
    toptyloo
        8
    toptyloo  
       2018-11-28 22:35:06 +08:00
    上面全用虚拟环境的,说不定 LZ 不是为了开发用,只是为了安装一个工具呢?
    如果--user 不行的话,就去尝试一下发行版打的包,不推荐使用 sudo
    PS 感觉 LZ 对 Linux 的一些权限之类的东西了解得不够多,建议去看看.
    feather12315
        9
    feather12315  
       2018-11-28 22:35:23 +08:00 via Android   ❤️ 1
    不都是 sudo apt install 么?
    pip 装,得手动管理呀,交给发行版管理多好
    XIVN1987
        10
    XIVN1987  
    OP
       2018-11-28 22:47:33 +08:00
    @feather12315
    不是所有 python package 都能 apt 安装吧??有些 python 包可能没做 apt 的安装包
    lance6716
        11
    lance6716  
       2018-11-28 22:49:56 +08:00 via Android
    anaconda
    matsuz
        12
    matsuz  
       2018-11-28 22:51:02 +08:00   ❤️ 11
    pip install 和 sudo pip install 是同一个命令,区别在于加了 sudo 运行拥有 root 权限,它们和 sudo apt install 都是直接将包安装到系统的 site-packages 文件夹中。

    sudo apt install 是安装发行版打包好的 python 包,这种包通常版本都非常旧。
    pip install 是直接从 pypi 源中下载安装,这个都是最新版,而且 pip 可以控制安装的版本。pip install 由于直接安装到系统目录里面,所以一定要有 root 权限。

    还有个命令是 pip install --user,这个是安装到当前用户的 home 目录中的 site-packages 中,执行这个命令不需要 root 权限。

    上面的流程都非常清晰,没有什么不好理解的地方。

    顺便讲一下 sudo,这个命令是可以让后面跟的命令以 root 权限执行的程序。
    不过通常来讲,还是推荐新建一个虚拟环境来安装包。
    XIVN1987
        13
    XIVN1987  
    OP
       2018-11-28 22:51:33 +08:00
    @toptyloo

    确实是,比如我用 esptool.py 这个工具,需要安装 esptool 包,,如果装到虚拟环境里,,还得先激活一下虚拟环境才能使用 esptool.py ,,麻烦了一步,,

    不知道在.bashrc 中加条语句自动激活虚拟环境会不会影响系统运行

    另外,,你上面提到“--user ”,,这下选项更多了,,更不知道如何是好了>﹏<

    我去 google 查查去
    XIVN1987
        14
    XIVN1987  
    OP
       2018-11-28 23:00:29 +08:00
    @matsuz

    讲的很清晰,,非常感谢

    那应该是我记错了,,我只记得有一种安装方式会把 package 给安装到用户目录下的.local 目录下,,但没想起来命令是 pip install --user,,所以就认为不带 sudo 的 pip 会将包安装到用户目录去

    所以,pip install 要么带 sudo、要么带--user,,
    Trim21
        15
    Trim21  
       2018-11-28 23:10:45 +08:00
    开一个 venv 全都在 venv 里面用 pip 装
    xpresslink
        16
    xpresslink  
       2018-11-28 23:11:26 +08:00
    楼主此言差矣,在 LINUX 下安装包和部署都比 Windows 要简单方便。
    通常都是用 virtualenv,
    在开发项目时用到那个第三方依赖包就直接在 requirmens.txt 里加一行。
    然后在目标环境里直接
    pip install -r requirements.txt 就可以了。
    likuku
        17
    likuku  
       2018-11-28 23:13:34 +08:00
    @toptyloo [上面全用虚拟环境的,说不定 LZ 不是为了开发用,只是为了安装一个工具呢?]

    不少 linux 发行版本身很依赖系统自带的 python,可能它版本不是你想用的,
    那最好还是起个虚拟版本 /环境 来装,君不见 v 站三天两头有人哀嚎 把系统自带 python 搞坏而让系统崩坏的么?

    用惯 pyenv/pipenv/virtualenv 之后,的确我就算装个什么工具,也是单独给它个目录另起独立虚拟环境。

    前后也就多花十秒,多耗百 M 硬盘空间什么,然而不会扰乱环境 /扰乱其它项目,这点代价很轻微了。
    XIVN1987
        18
    XIVN1987  
    OP
       2018-11-28 23:23:38 +08:00
    @matsuz

    我刚才试了下,

    pip install markdown

    >>> import markdown
    >>> markdown
    <module 'markdown' from '/home/wmx/.local/lib/python2.7/site-packages/markdown/__init__.pyc'>

    我并没有用--user,,包还是被安装到了用户目录下,跟你说的不一样啊

    我用的是 WSL ( Ubuntu on Windows ),,这个应该不影响 pip 的安装位置吧
    feather12315
        19
    feather12315  
       2018-11-28 23:31:05 +08:00 via Android
    @XIVN1987 #10,一般都有,没有的就用 virtualenv 了,尽量避免 pip
    ysc3839
        20
    ysc3839  
       2018-11-28 23:37:20 +08:00 via Android
    如果 Python 安装在 Program Files 文件夹里,pip install 也是需要管理员权限的。
    apt install 应该是针对那些不全是 Python 代码写的,需要编译的项目,软件源提供了编译好的版本。如果通过 pip install 安装的话是会下载源代码然后编译的。
    tankeco
        21
    tankeco  
       2018-11-29 01:58:13 +08:00
    还有很多……
    pip install
    apt install python-xxx
    python3 setup.py install
    python3 setup.py develop
    pip install .

    然后我从来没有分清楚过这些地址:
    /usr/lib/python3.x/dist-packages
    /usr/lib/python3.x/site-packages
    /usr/local/lib/python3.x/site-packages
    /usr/local/lib/python3.x/dist-packages
    .local/lib/python3.5/site-packages
    xiaket
        22
    xiaket  
       2018-11-29 06:10:59 +08:00
    我觉得是你不太懂 Linux...
    FourAndHalf
        23
    FourAndHalf  
       2018-11-29 08:40:31 +08:00
    恰恰相反
    XIVN1987
        24
    XIVN1987  
    OP
       2018-11-29 09:09:58 +08:00
    @xiaket
    确实不太懂,,所以发帖问下懂 Linux 的怎么安装 Python 包,,

    现在看来,大都推荐 virtualenv,,可能这就是 Linux 下的最佳实践吧
    XIVN1987
        25
    XIVN1987  
    OP
       2018-11-29 09:11:02 +08:00
    @FourAndHalf
    能给解释下原因吗??
    clino
        26
    clino  
       2018-11-29 09:32:59 +08:00
    其实 windows 下部署我一样用 virtualenv
    Linux 下如果为了方便可以在把 bash 配置成默认加载一个常用的 env,我因为正在做 py2/3 切换,所以有两个 env,建了两个 alias 来方便切换
    Hieast
        27
    Hieast  
       2018-11-29 09:35:44 +08:00 via Android
    楼上似乎露了一点,我来补充一下。
    sudo 默认是会做一些环境变量的清理工作的,而 python 虚拟环境,包括 pip 都是根据一些特定环境变量来寻址的。

    你用 pyenv 也好,不用也罢,以后你安装 python 包的时候把 pip 的路径手动写完整就不会有问题。系统的自带的 python 版本固定,并且需要管理员权限才能写入,一般不推荐使用。
    自己额外安装一个合适的版本或者用 pyenv 管理多版本都好。

    重点说三遍:pip 路径写完整
    重点说三遍:pip 路径写完整
    重点说三遍:pip 路径写完整
    shylockhg
        28
    shylockhg  
       2018-11-29 09:39:49 +08:00
    你直接用 pip install --user 就行了
    zephyru
        29
    zephyru  
       2018-11-29 09:50:24 +08:00
    @XIVN1987
    ...你还是没搞懂..不带 sudo 的话是以当前用户权限来安装的,默认是安装到用户目录...即使没带--user...
    感觉之前的讨论应该有人提过了..
    julyclyde
        30
    julyclyde  
       2018-11-29 10:08:53 +08:00
    apt 另说
    pip 和 sudo pip 是你抗拒学习的问题,不是 pip 的问题
    XIVN1987
        31
    XIVN1987  
    OP
       2018-11-29 10:15:56 +08:00
    @zephyru

    刚刚逐步实际操作了一遍,,简略过程如下:
    ```
    ubuntu@VM-0-9-ubuntu:~$ pip3 --version
    pip 8.1.1 from /usr/lib/python3/dist-packages (python 3.5)

    ubuntu@VM-0-9-ubuntu:~$ pip3 install markdown
    Successfully installed markdown-3.0.1

    ubuntu@VM-0-9-ubuntu:~$ pip3 show markdown
    Location: /home/ubuntu/.local/lib/python3.5/site-packages

    pip3 uninstall markdown

    ubuntu@VM-0-9-ubuntu:~$ sudo pip3 install --upgrade pip

    ubuntu@VM-0-9-ubuntu:~$ pip3 --version
    pip 18.1 from /usr/local/lib/python3.5/dist-packages/pip (python 3.5)

    ubuntu@VM-0-9-ubuntu:~$ pip3 install markdown
    Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/usr/local/lib/python3.5/dist-packages/Markdown-3.0.1.dist-info'
    Consider using the `--user` option or check the permissions.
    ```

    你看,“ pip install markdown ”在不同的 pip 版本中执行是不一样的,,你说的那种情况是旧版 pip 的操作
    codehz
        32
    codehz  
       2018-11-29 10:19:44 +08:00
    提示一下,千万不要用 sudo pip install 除非你打算以后不用发行版的包管理系统。。。
    这显而易见会破坏系统环境。。。
    pip install --user 用来做单用户的全局安装,如果要多用户使用,推荐方案是自己用发行版的工具打包一个。。。
    lolizeppelin
        33
    lolizeppelin  
       2018-11-29 10:41:28 +08:00
    开发人员就喜欢瞎咋折腾环境
    看着就烦
    rayhy
        34
    rayhy  
       2018-11-29 10:53:14 +08:00
    所以 linux 下安装 python 包确实不如 Windows 下安装清晰,楼主的说法是正确的。但是 linux 下这样设计带来了更精细的控制,可能是生产环境下使用必需的。
    Cbdy
        35
    Cbdy  
       2018-11-29 10:54:56 +08:00
    这方面 Python 设计不是很合理。建议用 Docker 换语言
    LokiSharp
        36
    LokiSharp  
       2018-11-29 10:57:44 +08:00
    我觉得 Linux 比 Windows 清晰啊,怎么装都是那么几个位子
    XIVN1987
        37
    XIVN1987  
    OP
       2018-11-29 11:02:04 +08:00
    @rayhy
    终于遇到一个赞同的,,感动( ̄▽ ̄)/
    XIVN1987
        38
    XIVN1987  
    OP
       2018-11-29 11:03:18 +08:00
    @Cbdy
    不是 Python 设计的问题,,是因为 Linux 本身严重依赖 Python

    要像 Windows 那样系统本身不使用 Pyhon,,就没有这些问题了
    LokiSharp
        39
    LokiSharp  
       2018-11-29 11:12:57 +08:00
    @XIVN1987 #38 你的问题是不理解 Linux 权限机制,和 Python Pip 没关系。。。Linux 是完整的多用户系统和 Windows 这种半吊子多用户不一样的
    lolizeppelin
        40
    lolizeppelin  
       2018-11-29 11:16:46 +08:00
    和清晰没任何关系

    是规范化系统管理的问题

    开发喜欢瞎搞不按系统规范来做自然觉得束缚
    xcai
        41
    xcai  
       2018-11-29 11:24:14 +08:00 via Android
    其实你所说的无非是更熟悉 Linux 还是更熟悉 Windows,而你属于后者
    laike9m
        42
    laike9m  
       2018-11-29 12:58:50 +08:00 via Android
    pyenv 一把梭就完事了
    laike9m
        43
    laike9m  
       2018-11-29 12:59:25 +08:00 via Android
    哦,最好配合 pipsi 使用,安装一些日常要用的命令行工具
    wizardoz
        44
    wizardoz  
       2018-11-29 13:06:34 +08:00
    每个项目一个 virtualenv 是所有平台的最佳实践,只是 windows 下可能 virtualenv 有时候会装不上有些包。
    Linxing
        45
    Linxing  
       2018-11-29 13:40:08 +08:00
    微笑脸
    chocotan
        46
    chocotan  
       2018-11-29 14:48:50 +08:00
    @XIVN1987 linux 怎么严重依赖 python 了。。。。。。
    tatelucky
        47
    tatelucky  
       2018-11-29 14:55:27 +08:00
    微微一笑,把 python 和 linux 并为一谈,,,,,,简单说吧,linux 是你一辈子都学不完的东西
    XIVN1987
        48
    XIVN1987  
    OP
       2018-11-29 15:00:51 +08:00
    @chocotan
    我的意思是 linux 发行版本有些关键软件会使用 python 和 python 的包
    如果升级了 python 自带的包,有可能会导致系统或者关键软件运行不起来
    XIVN1987
        49
    XIVN1987  
    OP
       2018-11-29 15:03:17 +08:00
    @tatelucky
    只是因为 linux 软件会使用 python,,导致不敢随意升级 linux 下 python 的包,,windows 下没有这个问题,,
    windows 本身不带 python,,python 都是自己安装的,,所以 windows 下 python 的包随意怎么升级也不会影响系统的运行
    reself
        50
    reself  
       2018-11-29 15:05:06 +08:00
    老是在这些细枝末节上钻,工作做完了吗?
    sazima
        51
    sazima  
       2018-12-02 18:42:33 +08:00
    这个没有什么可以比较的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4548 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 09:58 · PVG 17:58 · LAX 01:58 · JFK 04:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.