我现在有这样一个场景,内网不能连接互联网,需要部署一套基于 selenium 的自动化系统,不能用 pip 从网上下包,也不允许用 docker 做镜像导入,只能用安装包一个个安装部署,最多自己写写脚本自动安装。
我可以在外网弄一个虚拟机,安装一模一样的操作系统,试验部署直至整个系统稳定运行,然后把所有依赖打包至内网,然后手动或者用脚本重复整个过程。
这个部署过程还得分别在 Debian 9 和 Windows 7 上面部署两套,我准备弄 Debian 9 和 Win 7 两套虚拟机分别做,都只能单机条件下,而且不能自己内网弄个服务器建一个本地源存放所有包,有什么比较好的解决方案。最好是能自动化脚本,机器数量还比较多。
目前看了一下,本地包管理的话使用 pip 和 pyinstaller,Python 环境管理有 pyenv,pipenv 还是 virtualenv,已知的问题是 pyenv 必须使用 pyenv 管理的 python 版本,其他还有什么坑?麻烦各位支个招,有踩坑过的也来分享一下。
     1 
                    
                    RRRoger      2021-05-19 16:02:10 +08:00    使用 conda pack 打包  用 miniconda 作为虚拟环境 
                 | 
            
     2 
                    
                    abersheeran      2021-05-19 16:03:27 +08:00    恰好我也有这样的需求。推荐使用 pdm 解决。 
                 | 
            
     3 
                    
                    noqwerty      2021-05-19 16:04:27 +08:00 via Android    conda 或者 poetry 吧 
                 | 
            
     4 
                    
                    frostming      2021-05-19 16:08:33 +08:00    PDM 可以把依赖装到__pypackages__里,直接打包带走,在目标机器上只要 PYTHONPATH=path/to/__pypackages__/3.8/lib 即可 
                可以参考 https://pdm.fming.dev/usage/advanced/#use-pdm-in-a-multi-stage-dockerfile 打包还可以用 zipapp 或者 shiv 这种  | 
            
     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 ......................... ```  | 
            
     6 
                    
                    jianjian001      2021-05-19 16:10:47 +08:00    pyenv 管理版本 
                poetry 管理依赖  | 
            
     7 
                    
                    shayuvpn0001   OP  | 
            
     8 
                    
                    zeroDev      2021-05-19 16:23:54 +08:00 via Android 
                    
                    如果你习惯命令行界面 
                pipenv,反正自带的那个就行 如果习惯 GUI,那不清楚了  | 
            
     9 
                    
                    ctro15547      2021-05-19 16:25:19 +08:00 
                    
                    conda  太爽了。。。 
                 | 
            
     10 
                    
                    Jirajine      2021-05-19 16:29:24 +08:00 
                    
                    poetry or pyflow 
                 | 
            
     11 
                    
                    paopjian      2021-05-19 16:32:06 +08:00 
                    
                    zip 打包 conda 环境,但是有些包必须要用 pip 重装一遍,只好附带 whl 了 
                 | 
            
     12 
                    
                    frostming      2021-05-19 16:34:18 +08:00    @shayuvpn0001 不是让用 Docker,是提供借鉴,这里 build 和 run 两个 stage 刚好对应你外网和内网的机器 
                 | 
            
     13 
                    
                    zone10      2021-05-19 16:47:13 +08:00    用 virtualenv, 把依赖下在 venv 目录里整个复制过去就行. 是不允许用 docker 还是不允许拉 docker 镜像, 如果是后者可以把 docker 镜像导出为压缩包再去内网安装, win7 能用 docker, 有个工具叫 DockerToolBox, 如果是 win10 能用 Hyper-V 就更方便了, Docker Desktop 了解一下 
                 | 
            
     14 
                    
                    terencehan      2021-05-19 18:48:41 +08:00 
                    
                    一直在用 miniconda 
                 | 
            
     15 
                    
                    z740713651      2021-05-19 18:52:16 +08:00 
                    
                    miniconda +1 
                 | 
            
     16 
                    
                    yzc27      2021-05-19 18:58:26 +08:00 via iPhone 
                    
                    poetry 
                 | 
            
     17 
                    
                    youngce      2021-05-19 19:01:23 +08:00 
                    
                    回归 virtualenv,方便生产纯净的依赖文件 
                 | 
            
     18 
                    
                    SenLief      2021-05-19 20:13:31 +08:00 
                    
                    python 不是自带个虚拟环境吗? python -m venv .venv 这个和上面的有啥差别吗? 
                 | 
            
     19 
                    
                    cmdOptionKana      2021-05-19 21:40:21 +08:00    还是觉得 miniconda 的逻辑最清晰 
                 | 
            
     20 
                    
                    among      2021-05-19 22:18:44 +08:00 
                    
                    
                 | 
            
     21 
                    
                    clino      2021-05-19 22:20:09 +08:00    我一般用 virtualenv+pyenv 
                 | 
            
     22 
                    
                    wongskay      2021-05-19 23:01:38 +08:00 via iPhone    anaconda 
                 | 
            
     23 
                    
                    ClericPy      2021-05-19 23:28:03 +08:00    最近同样部署 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 参数), 打包后当虚拟环境使  | 
            
     24 
                    
                    shayuvpn0001   OP @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  | 
            
     25 
                    
                    xiebinbin666      2021-05-20 17:09:06 +08:00 
                    
                    
                 | 
            
     26 
                    
                    frostming      2021-05-28 15:18:18 +08:00 
                    
                    @shayuvpn0001 可以,PDM 就是这样工作的 
                 |