V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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
raawaa
V2EX  ›  Python

Python 的包管理

  •  
  •   raawaa ·
    raawaa · Dec 12, 2018 · 4880 views
    This topic created in 2697 days ago, the information mentioned may be changed or developed.

    刚刚入门 python, 是从隔壁 nodejs 转过来的.

    node 里用 npm 管理包和依赖十分方便, python 里貌似最近才出现类似的东西:pipenv

    但是 pipenv 每次算个 lockfile 就要很久, 效率好低. 难道 python 的依赖管理就这么不堪吗. 求教

    Supplement 1  ·  Dec 12, 2018
    关于 pipenv 感觉有些朋友好像不太熟悉。
    我自己转了篇 pycon 2018 上的相关演讲: https://www.bilibili.com/video/av37119093
    里面讲到了 python 包管理方式的演进历史和为什么要用 pipenv
    29 replies    2018-12-15 11:50:10 +08:00
    Trim21
        1
    Trim21  
       Dec 12, 2018
    Q:生成 Pipfile.lock 太慢?

    A:不像 npm 等依赖管理工具(依赖通过纯文本定义),对于 Python 包,如果你要获取详细的依赖情况,需要下载安装包并执行 setup.py 文件,所以会耗费一定时间。通常来说,更换 PyPI 源已经可以大幅提升速度。如果你仍然不想等待生成 Pipfile.lock 的时间,那么可以在执行 pipenv install 命令时添加--skip-lock 选项来跳过 lock 步骤,最后使用 pipenv lock 命令来统一执行 lock 操作。
    xiaket
        2
    xiaket  
       Dec 12, 2018   ❤️ 1
    据我所知, 那是因为 npm 根本没有处理依赖管理和版本冲突问题吧...
    daxy223
        3
    daxy223  
       Dec 12, 2018 via Android
    anaconda 一劳永逸
    orangeade
        4
    orangeade  
       Dec 12, 2018 via Android   ❤️ 1
    pip + virtualenv 不就够了?用 pipenv 的理由?
    OldPanda
        5
    OldPanda  
       Dec 12, 2018
    赞成楼上和楼上的楼上,平时自己开项目还是 virtualenv + pip 用的比较多,除非是刻意想要了解一下 pipenv 这个新工具
    silkriver
        6
    silkriver  
       Dec 12, 2018
    pip 加标准库的 venv 也就够了
    fivestrong
        7
    fivestrong  
       Dec 12, 2018 via Android   ❤️ 1
    pipenv 改一下 pipfile 里面的下载地址,会快很多
    zst
        8
    zst  
       Dec 12, 2018 via Android
    用 anaconda 吧 舒服
    xiaket
        9
    xiaket  
       Dec 12, 2018   ❤️ 5
    @orangeade

    pip 解决冲突的办法挺凑合的, 有些 corner case 没解决好.

    例如你需要安装某包 A 和 B, A 依赖某 C > 1.5, B 依赖某 C <= 2.0, 此时, 某 C 的最新版是 2.3. 我们期待 pip 安装的结果是装一个满足 1.5 < C <= 2.0 的版本, 但是 pip 会按 requirements 文件的顺序挨个解决冲突, 因此它先看 A 的依赖, 发现要大于 1.5, 于是直接装了一个满足大于 1.5 的版本 2.3, 等回头要装 B 的时候就耍赖报个版本冲突的警告不管了. 我们使用时的解决办法是锁 C 的版本为 2.0,并写到 A 和 B 的前面, 这样安装 A 和 B 时发现依赖都已经被满足了, 不会装新包. Github 上相关讨论链接: https://github.com/pypa/pip/issues/988

    pipenv 在这一点上是比 pip 更好的. 它会分析一个 requirements 文件里的所有依赖, 然后正确解决上面所述的冲突. 这一点上, 是比 pip 优秀的.

    当然, 它还有一些较小的方便之处, 例如, 所有的 venv 都会放在一个统一的地方, 不会放到当前目录下, 这样你也不需要在.gitignore 里加东西不是?
    clino
        10
    clino  
       Dec 12, 2018
    没用过 pipenv,大概看了下也觉得没需要用
    直接用 virtualenv 觉得就挺好了
    im67
        11
    im67  
       Dec 12, 2018   ❤️ 1
    推荐 pipenv,跟 npm 很像
    chengxiao
        12
    chengxiao  
       Dec 12, 2018
    python 因为系统中经常存在多个版本且可能会切换的原因 所以感觉 pipenv 其实不是最好的选择
    常规的 pip+virtualenv 是最稳定的
    xuanli
        13
    xuanli  
       Dec 12, 2018
    pip + venv 或者 virtualenv
    vissssa
        14
    vissssa  
       Dec 12, 2018
    pyenv 每个文件夹一个环境
    metamask
        15
    metamask  
       Dec 12, 2018
    下载慢换源:
    [[source]]

    url = "https://pypi.doubanio.com/simple"
    verify_ssl = true
    name = "douban"


    [packages]


    lock 慢,加上
    --skip-lock
    ClutchBear
        16
    ClutchBear  
       Dec 12, 2018
    包管理用 requirement.txt 就行了啊.
    用那么复杂的工具干啥.
    jmc891205
        17
    jmc891205  
       Dec 12, 2018
    conda 也不错 pip+venv 也够用
    xiaotiange
        18
    xiaotiange  
       Dec 12, 2018 via Android
    用 anaconda,发现真香,包管理加环境管理,一劳永逸
    xpresslink
        19
    xpresslink  
       Dec 12, 2018
    目前做 Python 开发部署,比较成熟普遍的工程实践是使用 virtualenv
    在开发的时候用 Pycharm 创建一个项目和对应的虚拟环境,
    每需要增加一个包就在项目根目录的的 requirements.txt 中增加一行包名,
    这个特性是被 Pycharm 支持的,pycharm 就自动帮你把包装在虚拟环境了。

    部署的时候也是先用 virtualenv 先创建一个虚拟环境然后在虚拟环境中执行
    pip install -r requirements.txt 就自动把所有依赖包安装齐了。
    saucerman
        20
    saucerman  
       Dec 12, 2018 via Android
    Anoconda 会改变你对 python 各种乱七八糟的包和版本的混乱看法
    zqguo
        21
    zqguo  
       Dec 12, 2018
    pipenv 真香
    www5070504
        22
    www5070504  
       Dec 12, 2018   ❤️ 1
    python 的包管理就跟 shi 一样 居然还有重名包这种操作 当初刚开始弄 docker 的时候简直没被坑死
    miniyao
        23
    miniyao  
       Dec 12, 2018
    包管理里面的自依赖版本冲突,虽然日常中出现的比较少,也没有发现好的解决方法。
    frostming
        24
    frostming  
       Dec 12, 2018
    @OldPanda @jmc891205 @xuanli 之所以 virtualenv+pip 够用是没碰到坑

    @xiaket 描述的问题是真实存在且 pip 没有解决的,pipenv 不仅是 pip+virtualenv,它还包括 resolver.
    raawaa
        25
    raawaa  
    OP
       Dec 12, 2018
    @xiaket "npm 没有处理依赖管理和版本冲突问题"这点不太明白。

    http://npm.github.io/how-npm-works-docs/gitbook/images/npm3deps4.png

    我的理解仅限于上面这张老图……
    xiaket
        26
    xiaket  
       Dec 13, 2018
    每个包有个自己的子命名空间什么, 就我的理解, 真的不叫处理吧?
    frostming
        27
    frostming  
       Dec 13, 2018
    @raawaa 解决冲突的结果就是整个环境中 A 包只存在一个版本,而这个版本是考虑所有依赖后找到的满足所有限制的版本。不像 npm,可能会有多个版本共存。

    pip 没有解决这个问题,最后 A 包的版本可能并不满足所有限制
    frostming
        28
    frostming  
       Dec 13, 2018   ❤️ 1
    @raawaa 解决冲突就好像在解方程组:
    A>=2.0, < 3.0
    A~=2.0
    A>=2.5

    解得 A==2.8.5,所以这个过程叫 resolve
    raawaa
        29
    raawaa  
    OP
       Dec 15, 2018 via Android
    @frostming 明白了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2516 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 75ms · UTC 07:51 · PVG 15:51 · LAX 00:51 · JFK 03:51
    ♥ Do have faith in what you're doing.