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

内网环境中,如何快速的安装 py 的依赖包

  •  
  •   among · 2020-09-07 16:41:34 +08:00 · 4007 次点击
    这是一个创建于 1298 天前的主题,其中的信息可能已经有所发展或是发生改变。
    原先有个系统,是基于 py3.5 的,内网的离线环境,没有 py 的内部源,当时安装 py 包的依赖,是一个个手工拷贝 whl 文件。

    现在准备迁移到新环境,包括 linux 的版本(升级到 centos 8.2 ),py 的版本( 3.6.8 ),因为是内网,无法连接外网。

    在迁移的时候,遇到了问题,安装一个,提示一个依赖,再拷贝安装,又有新的依赖。

    感觉无穷无尽啊,如何快速的把所需的依赖包,都一次性准备好。
    24 条回复    2020-09-08 19:25:39 +08:00
    CallMeReznov
        1
    CallMeReznov  
       2020-09-07 16:43:03 +08:00
    自己搭建内网 PIP 源啊
    zhzy
        2
    zhzy  
       2020-09-07 16:44:29 +08:00 via iPhone
    直接把整个虚拟环境拷过去啊
    bruce0
        3
    bruce0  
       2020-09-07 16:50:43 +08:00
    虚拟机的话,直接整个镜像复制过去最简单

    要不就先在外网安装完,再搞到内网, 我们就这样干过
    wandehul
        4
    wandehul  
       2020-09-07 16:57:47 +08:00   ❤️ 1
    做个 docker image 不行吗
    676529483
        5
    676529483  
       2020-09-07 17:13:07 +08:00
    感觉是你包管理没处理好,一般都是 requirements 记录的吧
    wangyzj
        6
    wangyzj  
       2020-09-07 17:16:21 +08:00
    docker
    复制 venv 环境
    下载包然后传过去安装
    换 go
    ClutchBear
        7
    ClutchBear  
       2020-09-07 17:19:24 +08:00   ❤️ 1
    用 miniconda,
    可以直接安装到 /home 目录下, 安装好第三方包后,
    直接 zip 压缩成文件, 然后拷贝新机子就是了.
    Rumplestiltskin
        8
    Rumplestiltskin  
       2020-09-07 17:24:28 +08:00
    我觉得现在最好的方案就是 搞个容器 然后把容器 压缩包考过去直接 运行容器
    不过这样的前提是 docker 已经装了。
    不能搞容器 那就虚拟环境吧。
    v2exblog
        9
    v2exblog  
       2020-09-07 17:25:48 +08:00
    同问啊,有没有什么好的解决方案,一个一个装太难受了
    WingOnSummit
        10
    WingOnSummit  
       2020-09-07 17:33:18 +08:00 via Android
    在外网环境里,pip download 包名,把相关的依赖包一次性下好。
    scukmh
        11
    scukmh  
       2020-09-07 17:35:48 +08:00
    能 ssh 上去吗?
    ```
    ssh yourServer -R localhost:7890:localhost:7890
    export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890
    pip install xxx
    ```
    aimoji
        12
    aimoji  
       2020-09-07 19:08:46 +08:00 via Android
    pip 可以下载包含所有依赖的离线包,然后拷进内网用 pip 离线安装,具体命令看下 pip 帮助吧,好久以前搞过
    aaa5838769
        13
    aaa5838769  
       2020-09-07 19:46:08 +08:00
    外网制作一个 docker 镜像包
    cissoid
        14
    cissoid  
       2020-09-07 20:45:31 +08:00   ❤️ 3
    pip download -r requirements.txt -d deps/

    pip install -f deps/
    starsky007
        15
    starsky007  
       2020-09-07 22:22:31 +08:00
    把依赖与程序一直打包,我在部署程序到 AWS Lambda 上时就是这么操作的,完全可行。
    先写好 requirements.txt ,然后使用以下命令,将依赖包安装到 target 目录下:
    pip install -r requirements.txt -t target
    然后,将程序复制到 target 目录下,一直打包,就可以了。
    among
        16
    among  
    OP
       2020-09-07 22:53:58 +08:00
    @cissoid
    tks

    正在 ing

    pip3 download -d mypip --platform linux_x86_64 --python-version 36 --implementation cp --abi none -r requirements.txt
    xchaoinfo
        17
    xchaoinfo  
       2020-09-07 23:10:18 +08:00 via Android
    pip install -f deps/ --no_index
    这个需要多加一个参数
    ClericPy
        18
    ClericPy  
       2020-09-08 00:00:25 +08:00
    目前我是通过 shiv 打包做的部署, 主要就是像 jar 包一样把依赖环境打包成一起. 官方文档建议的是打包成 app, 不过我更喜欢当 venv 来用

    目前 hadoop 任务已经全是这玩意了, 不过得改环境变量把缓存文件放到当前目录, 其他没什么坑, 性能超过 pex, 稳定性也足够好
    cz5424
        19
    cz5424  
       2020-09-08 00:35:02 +08:00 via iPhone
    最简单就拷贝 venv,复杂点就制作 docker 镜像
    arischow
        20
    arischow  
       2020-09-08 01:19:01 +08:00
    能访问外网的机器:

    pip install wheel && pip wheel -r requirements.txt --wheel-dir=/svc/wheels

    即,安装 wheel 并按照 requirements.txt 编译 whl

    内网的机器:

    pip install --no-index --find-links=/svc/wheels -r requirements.txt

    即,使用本地 /svc/wheels 下的 whl 安装 requirements.txt ,并禁止其在 pypi index 下载安装。

    如果是 Docker 可以用 multi-stage build:

    ```docker
    # build wheels
    FROM python:3.7.9-buster as builder

    ENV PYTHONFAULTHANDLER=1 \
    PYTHONUNBUFFERED=1 \
    PYTHONHASHSEED=random \
    # pip:
    PIP_NO_CACHE_DIR=yes \
    PIP_DISABLE_PIP_VERSION_CHECK=on \
    PIP_DEFAULT_TIMEOUT=100

    RUN mkdir /svc
    WORKDIR /svc
    ADD ./requirements.txt .
    RUN pip install wheel && pip wheel -r requirements.txt --wheel-dir=/svc/wheels

    # clean slate
    FROM python:3.7.9-slim-buster as production

    # non-root user
    RUN addgroup --system --gid 101 devops && \
    adduser --system --disabled-login --ingroup devops --gecos "devops user" --shell /bin/false --uid 101 devops

    RUN mkdir -p /src/languages && \
    chown -R devops:devops /src

    # python packages
    COPY --from=builder /svc /svc
    WORKDIR /svc
    RUN pip install --no-index --find-links=/svc/wheels -r requirements.txt && \
    rm -rf /svc

    ```
    gtlions
        22
    gtlions  
       2020-09-08 08:20:09 +08:00 via iPhone
    这是一个转 Go 的原因
    kios
        23
    kios  
       2020-09-08 09:05:20 +08:00
    打包成 docker 镜像 ,然后到离线环境部署
    wuwukai007
        24
    wuwukai007  
       2020-09-08 19:25:39 +08:00 via Android
    内网 docker 也是很烦的,建议你建议公司搭个镜箱源
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   966 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:34 · PVG 04:34 · LAX 13:34 · JFK 16:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.