Python 环境管理用那一套比较好: pyenv, pipenv 还是 virtualen - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
shayuvpn0001
V2EX    程序员

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

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

    我现在有这样一个场景,内网不能连接互联网,需要部署一套基于 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   2
    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  
       2021-05-19 20:13:31 +08:00
    python 不是自带个虚拟环境吗? python -m venv .venv 这个和上面的有啥差别吗?
    cmdOptionKana
        19
    cmdOptionKana  
       2021-05-19 21:40:21 +08:00   1
    还是觉得 miniconda 的逻辑最清晰
    among
        20
    among  
       2021-05-19 22:18:44 +08:00
    @RRRoger 顺便问下,用 conda pack 打包的东西包括 py 的基础环境么。

    如果是 centos7 下打包的 py3.6, 在 centos 8 中 使用,是否会有问题。
    clino
        21
    clino  
       2021-05-19 22:20:09 +08:00   1
    我一般用 virtualenv+pyenv
    wongskay
        22
    wongskay  
       2021-05-19 23:01:38 +08:00 via iPhone   1
    anaconda
    ClericPy
        23
    ClericPy  
       2021-05-19 23:28:03 +08:00   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
       2021-05-20 11:09:36 +08:00
    @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  
       2021-05-20 17:09:06 +08:00
    frostming
        26
    frostming  
       2021-05-28 15:18:18 +08:00
    @shayuvpn0001 可以,PDM 就是这样工作的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3807 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 05:10 PVG 13:10 LAX 22:10 JFK 01:10
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86