V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
shayuvpn0001
V2EX  ›  程序员

Python 环境管理用那一套比较好: pyenv, pipenv 还是 virtualen

  •  
  •   shayuvpn0001 · 2021-05-19 15:23:27 +08:00 · 3518 次点击
    这是一个创建于 365 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我现在有这样一个场景,内网不能连接互联网,需要部署一套基于 selenium 的自动化系统,不能用 pip 从网上下包,也不允许用 docker 做镜像导入,只能用安装包一个个安装部署,最多自己写写脚本自动安装。

    我可以在外网弄一个虚拟机,安装一模一样的操作系统,试验部署直至整个系统稳定运行,然后把所有依赖打包至内网,然后手动或者用脚本重复整个过程。

    这个部署过程还得分别在 Debian 9 和 Windows 7 上面部署两套,我准备弄 Debian 9 和 Win 7 两套虚拟机分别做,都只能单机条件下,而且不能自己内网弄个服务器建一个本地源存放所有包,有什么比较好的解决方案。最好是能自动化脚本,机器数量还比较多。

    目前看了一下,本地包管理的话使用 pip 和 pyinstaller,Python 环境管理有 pyenv,pipenv 还是 virtualenv,已知的问题是 pyenv 必须使用 pyenv 管理的 python 版本,其他还有什么坑?麻烦各位支个招,有踩坑过的也来分享一下。

    26 条回复    2021-05-28 15:18:18 +08:00
    RRRoger
        1
    RRRoger  
       2021-05-19 16:02:10 +08:00   ❤️ 2
    使用 conda pack 打包 用 miniconda 作为虚拟环境
    abersheeran
        2
    abersheeran  
       2021-05-19 16:03:27 +08:00   ❤️ 1
    恰好我也有这样的需求。推荐使用 pdm 解决。
    noqwerty
        3
    noqwerty  
       2021-05-19 16:04:27 +08:00 via Android   ❤️ 1
    conda 或者 poetry 吧
    frostming
        4
    frostming  
       2021-05-19 16:08:33 +08:00   ❤️ 1
    PDM 可以把依赖装到__pypackages__里,直接打包带走,在目标机器上只要 PYTHONPATH=path/to/__pypackages__/3.8/lib 即可

    可以参考 https://pdm.fming.dev/usage/advanced/#use-pdm-in-a-multi-stage-dockerfile

    打包还可以用 zipapp 或者 shiv 这种
    abersheeran
        5
    abersheeran  
       2021-05-19 16:09:51 +08:00
    补充楼上,这是我添加的两个环境变量。

    ```dockerfile
    ..................

    ENV PATH="/app/__pypackages__/3.9/bin:$PATH"
    ENV PYTHONPATH="/app/__pypackages__/3.9/lib:$PYTHONPATH"

    WORKDIR /app

    .........................
    ```
    jianjian001
        6
    jianjian001  
       2021-05-19 16:10:47 +08:00   ❤️ 2
    pyenv 管理版本
    poetry 管理依赖
    shayuvpn0001
        7
    shayuvpn0001  
    OP
       2021-05-19 16:17:16 +08:00
    @frostming
    @abersheeran

    Win 7 系统下面没办法用 Docker 吧
    zeroDev
        8
    zeroDev  
       2021-05-19 16:23:54 +08:00 via Android
    如果你习惯命令行界面
    pipenv,反正自带的那个就行
    如果习惯 GUI,那不清楚了
    ctro15547
        9
    ctro15547  
       2021-05-19 16:25:19 +08:00
    conda 太爽了。。。
    Jirajine
        10
    Jirajine  
       2021-05-19 16:29:24 +08:00
    poetry or pyflow
    paopjian
        11
    paopjian  
       2021-05-19 16:32:06 +08:00
    zip 打包 conda 环境,但是有些包必须要用 pip 重装一遍,只好附带 whl 了
    frostming
        12
    frostming  
       2021-05-19 16:34:18 +08:00   ❤️ 1
    @shayuvpn0001 不是让用 Docker,是提供借鉴,这里 build 和 run 两个 stage 刚好对应你外网和内网的机器
    zone10
        13
    zone10  
       2021-05-19 16:47:13 +08:00   ❤️ 1
    用 virtualenv, 把依赖下在 venv 目录里整个复制过去就行. 是不允许用 docker 还是不允许拉 docker 镜像, 如果是后者可以把 docker 镜像导出为压缩包再去内网安装, win7 能用 docker, 有个工具叫 DockerToolBox, 如果是 win10 能用 Hyper-V 就更方便了, Docker Desktop 了解一下
    terencehan
        14
    terencehan  
       2021-05-19 18:48:41 +08:00
    一直在用 miniconda
    z740713651
        15
    z740713651  
       2021-05-19 18:52:16 +08:00
    miniconda +1
    yzc27
        16
    yzc27  
       2021-05-19 18:58:26 +08:00 via iPhone
    poetry
    youngce
        17
    youngce  
       2021-05-19 19:01:23 +08:00
    回归 virtualenv,方便生产纯净的依赖文件
    SenLief
        18
    SenLief  
       364 天前
    python 不是自带个虚拟环境吗? python -m venv .venv 这个和上面的有啥差别吗?
    cmdOptionKana
        19
    cmdOptionKana  
       364 天前   ❤️ 1
    还是觉得 miniconda 的逻辑最清晰
    among
        20
    among  
       364 天前
    @RRRoger 顺便问下,用 conda pack 打包的东西包括 py 的基础环境么。

    如果是 centos7 下大打包的 py3.6, 在 centos 8 中 使用,是否会有问题。
    clino
        21
    clino  
       364 天前   ❤️ 1
    我一般用 virtualenv+pyenv
    wongskay
        22
    wongskay  
       364 天前 via iPhone   ❤️ 1
    anaconda
    ClericPy
        23
    ClericPy  
       364 天前   ❤️ 1
    最近同样部署 chrome 自动化工具, 用的自己写的 zipapps, 如果不嫌麻烦可以继续看, 我这边是 Jenkins 打包机 Linux 打包以后在 Hadoop 那边直接执行的

    看你情景必须把依赖和源代码打包起来一起发布, 可以尝试一下. 有几个前提:
    1. Python3.7+
    2. Windows 打包的只能 Windows 用, Linux 打包的只能 Linux 用, 有些库不是跨平台的要编译, 打包机 Python 版本也得和运行环境一致, 类似 selectolax 或者 psutil 这样有 .so 的就没法同时给 3.7 3.8 一起用
    3. 执行的时候估计会解压出一个文件夹在旁边

    步骤:
    1. 打包机上安装 python3.7 -m pip install zipapps -U --user
    2. python3.7 -m zipapps -c -a path_to_your_package -m package_name.__main__:main -o app.pyz -u="*" -r requirement.txt
    3. 客户端那边运行 python3.7 app.pyz

    打包以后文件挺大的, 毕竟带了所有依赖, 如果想依赖和代码分开打包也可以, 也可以不指定 entry_point (也就是那个-m 参数), 打包后当虚拟环境使
    shayuvpn0001
        24
    shayuvpn0001  
    OP
       364 天前
    @frostming 你是 PDM 作者?哈哈,厉害。

    另外,PDM 依赖 python 3.7 以上,我刚好有个包最高只能用到 3.6,可以先装 Python 3.7,然后 PDM,再用版本管理工具弄个 Python 3.6,再用 PDM 弄我的项目么?思路是 PDM 泡在 3.7 上,我自己的跑在 3.6 上。

    然后给你文档挑个书写错误:Use PDM in Continuous Integration# 这一部分里面,Here is an example worflow of GitHub 应该是 workflow
    xiebinbin666
        25
    xiebinbin666  
       364 天前
    frostming
        26
    frostming  
       356 天前
    @shayuvpn0001 可以,PDM 就是这样工作的
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2971 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 11:50 · PVG 19:50 · LAX 04:50 · JFK 07:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.