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
raawaa
V2EX  ›  Python

Python 的包管理

  •  
  •   raawaa ·
    raawaa · 2018-12-12 04:19:16 +08:00 · 4142 次点击
    这是一个创建于 2171 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    A:不像 npm 等依赖管理工具(依赖通过纯文本定义),对于 Python 包,如果你要获取详细的依赖情况,需要下载安装包并执行 setup.py 文件,所以会耗费一定时间。通常来说,更换 PyPI 源已经可以大幅提升速度。如果你仍然不想等待生成 Pipfile.lock 的时间,那么可以在执行 pipenv install 命令时添加--skip-lock 选项来跳过 lock 步骤,最后使用 pipenv lock 命令来统一执行 lock 操作。
    xiaket
        2
    xiaket  
       2018-12-12 06:52:50 +08:00   ❤️ 1
    据我所知, 那是因为 npm 根本没有处理依赖管理和版本冲突问题吧...
    daxy223
        3
    daxy223  
       2018-12-12 07:34:27 +08:00 via Android
    anaconda 一劳永逸
    orangeade
        4
    orangeade  
       2018-12-12 07:51:49 +08:00 via Android   ❤️ 1
    pip + virtualenv 不就够了?用 pipenv 的理由?
    OldPanda
        5
    OldPanda  
       2018-12-12 07:55:42 +08:00
    赞成楼上和楼上的楼上,平时自己开项目还是 virtualenv + pip 用的比较多,除非是刻意想要了解一下 pipenv 这个新工具
    silkriver
        6
    silkriver  
       2018-12-12 08:07:30 +08:00
    pip 加标准库的 venv 也就够了
    fivestrong
        7
    fivestrong  
       2018-12-12 08:07:34 +08:00 via Android   ❤️ 1
    pipenv 改一下 pipfile 里面的下载地址,会快很多
    zst
        8
    zst  
       2018-12-12 08:07:57 +08:00 via Android
    用 anaconda 吧 舒服
    xiaket
        9
    xiaket  
       2018-12-12 08:12:01 +08:00   ❤️ 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  
       2018-12-12 08:28:01 +08:00
    没用过 pipenv,大概看了下也觉得没需要用
    直接用 virtualenv 觉得就挺好了
    im67
        11
    im67  
       2018-12-12 08:50:43 +08:00   ❤️ 1
    推荐 pipenv,跟 npm 很像
    chengxiao
        12
    chengxiao  
       2018-12-12 09:00:49 +08:00
    python 因为系统中经常存在多个版本且可能会切换的原因 所以感觉 pipenv 其实不是最好的选择
    常规的 pip+virtualenv 是最稳定的
    xuanli
        13
    xuanli  
       2018-12-12 09:19:20 +08:00
    pip + venv 或者 virtualenv
    vissssa
        14
    vissssa  
       2018-12-12 09:24:56 +08:00
    pyenv 每个文件夹一个环境
    freakxx
        15
    freakxx  
       2018-12-12 09:49:54 +08:00
    下载慢换源:
    [[source]]

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


    [packages]


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

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

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

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

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

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

    解得 A==2.8.5,所以这个过程叫 resolve
    raawaa
        29
    raawaa  
    OP
       2018-12-15 11:50:10 +08:00 via Android
    @frostming 明白了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2999 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 14:14 · PVG 22:14 · LAX 06:14 · JFK 09:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.