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

不懂就问,关于 Python web 项目发布

  •  
  •   feitxue · 2021-04-25 15:12:38 +08:00 · 5267 次点击
    这是一个创建于 1309 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前刚接手了一个基于 tornado 的 python web 项目
    之前一直搞 java 开发
    要后续发版维护 小公司没有专职运维
    问下各位大佬
    python 有没有类似 java -jar 这种发布方式
    直接本地打包 jar 上传到服务器然后直接运行
    服务器只需要有 java 环境就行
    大概搜了下资料看了下
    要么上传到公共的 pypi,要么自建私有 pypi
    我理解的是部署类似 maven 的仓库环境
    感觉还是麻烦了点
    ps:我们目前用 svn 管理代码
    42 条回复    2021-04-27 09:58:18 +08:00
    xiqingongzi
        1
    xiqingongzi  
       2021-04-25 15:13:58 +08:00
    docker 化
    ipwx
        2
    ipwx  
       2021-04-25 15:14:42 +08:00
    只要有 python + pip,写好 requirements.txt 然后服务器上 pip install -r requirements.txt 安装好依赖就行。

    其实后面还有一个重点,用比如 gunicorn 做多进程。
    rationa1cuzz
        3
    rationa1cuzz  
       2021-04-25 15:21:13 +08:00
    没有,之前 linux 环境脚本,现在 windows 环境手动,同蹲一个解决方案
    privil
        4
    privil  
       2021-04-25 15:22:52 +08:00   ❤️ 1
    不用,就是 git 直接拉代码 ,然后重启 python 就完了吗。
    RockShake
        5
    RockShake  
       2021-04-25 15:56:33 +08:00
    Docker 或者 pipenv 吧
    arischow
        6
    arischow  
       2021-04-25 15:59:08 +08:00
    Docker & poetry

    当然最好有个 CI/CD 让你持续自动构建 Docker 镜像,我用的 GitHub Actions
    vZexc0m
        7
    vZexc0m  
       2021-04-25 16:22:25 +08:00
    janxin
        8
    janxin  
       2021-04-25 16:47:02 +08:00
    Docker 吧,少烦心事
    lucays
        9
    lucays  
       2021-04-25 16:51:29 +08:00
    docker 呗看下 docker-compose 啥的
    roundgis
        10
    roundgis  
       2021-04-25 16:57:22 +08:00 via Android
    Python 也有 executable egg 的方案

    不過用的人不多

    老老實實 docker 吧
    SlipStupig
        11
    SlipStupig  
       2021-04-25 17:00:17 +08:00   ❤️ 1
    如果是小公司的话,docker 和 k8s 这些太重了,可以使用 SVN hook 触发构建,python 可以用 wheel 打包成 whl, 然后使用 ssh 执行 pip install package.whl, 然后重启一下 python 就好了
    abersheeran
        12
    abersheeran  
       2021-04-25 17:07:56 +08:00
    docker + docker-compose 完事。
    feiandxs
        13
    feiandxs  
       2021-04-25 17:10:06 +08:00   ❤️ 1
    @SlipStupig 我恰恰觉得是 docker 更省事…… 对小公司来说。 就是因为人少,我们才 docker 化, 不做复杂的编排,只是希望 git 推送后,jenkins 走一套流程,花几分钟打包好容器镜像自动跑上去部署。

    因为人少才想尽可能自动。。。
    starsky007
        14
    starsky007  
       2021-04-25 17:16:26 +08:00
    pip 可以把依赖安装到指定目录下,示例:
    pip install -r requirements.txt -t target
    然后依赖、程序一直打包。
    robot1
        15
    robot1  
       2021-04-25 17:21:09 +08:00
    pyinstaller 生产用过没问题
    killva4624
        16
    killva4624  
       2021-04-25 17:27:40 +08:00
    docker 化+1,服务的启停可以用 docker-compose 解决,单机如果需要多副本甚至还可以上 swarm
    qianc1990
        17
    qianc1990  
       2021-04-25 17:37:12 +08:00 via iPhone
    起个脚本,直接拉代码就完了……
    clf
        18
    clf  
       2021-04-25 17:46:09 +08:00
    docker 化+1
    wunsch0106
        19
    wunsch0106  
       2021-04-25 18:00:53 +08:00
    1 、pyinstaller 打包,不过文件很大。
    2 、docker 化
    ClericPy
        20
    ClericPy  
       2021-04-25 21:01:49 +08:00   ❤️ 1
    办法太多了...

    1. docker 上面都提过了
    2. pipenv 或者 poetry 做版本控制
    2. 自己写个 makefile 整 venv
    3. 使用 zipapp 把 Python 代码和依赖都打包到 .zip 文件里面, 有点接近 jar, 服务器上只要有个 Python 解释器就可以了. 目前用过的有 shiv (linkedin 出品), zipapps (我自己写的). 前者每次构建貌似都需要重新解压缩依赖, 遇到 .so / .pyd 依赖的库或者其他 C 编译的不能跨 Python 版本也不能跨平台; 后者是模仿前者做的, 主要解决的就是非必须情况不要解压缩, 也支持惰性安装来曲线解决跨平台跨版本问题.
    4. pyinstaller 或者 Nuitka 或者 PyOxidizer 打包成编译好的, 不太推荐, 兼容性和性能都有问题
    ytmsdy
        21
    ytmsdy  
       2021-04-25 22:49:14 +08:00
    把代码搞到 github 上面,然后用 action 发布。合并到 master 分支就自动发布。不用管。
    qile1
        22
    qile1  
       2021-04-26 00:03:05 +08:00 via Android
    @robot1 fastapi 可以用 pyibstall 不?
    hushao
        23
    hushao  
       2021-04-26 03:38:02 +08:00
    楼上的哪有那么多事,tornado 本身做 web 服务器就不错,直接 pip 安装依赖之后,指定好端口,python main.py 运行就可。熟悉之后,再想怎么搞怎么搞。
    ila
        24
    ila  
       2021-04-26 08:10:32 +08:00 via Android
    用 pip download 吧依赖包下载到本地,写个 requirement 文件和安装脚本,在服务器运行。
    zjsxwc
        25
    zjsxwc  
       2021-04-26 08:36:46 +08:00
    git pull + 重启
    robot1
        26
    robot1  
       2021-04-26 09:20:41 +08:00
    @qile1 Fastapi 没用过 twisted 和 tornado 没问题
    David1119
        27
    David1119  
       2021-04-26 09:32:19 +08:00   ❤️ 1
    这不是本末倒置吗?脚本语言还想着去打包发布???你 php 会打包再发布吗?
    tabris17
        28
    tabris17  
       2021-04-26 09:39:04 +08:00
    python 的第三方模块可能有二进制代码,如果开发环境和服务器环境有差异,打包的话可能会有问题。还是 docker 吧
    feitxue
        29
    feitxue  
    OP
       2021-04-26 09:59:51 +08:00
    @David1119 #27 明白了...之前没搞过脚本语言发布....沉沦于 java,思路搞错了.感谢.
    SlipStupig
        30
    SlipStupig  
       2021-04-26 10:27:31 +08:00
    @feiandxs docker 需要学习一堆东西,还需要搞 Jenkins 那套,本身这个事干成了收益很低的,不值得额外去学
    est
        31
    est  
       2021-04-26 10:30:35 +08:00
    python 项目不是简单的 jar,一般都包含了类似 JNI 的操作。

    LZ 节哀
    z740713651
        32
    z740713651  
       2021-04-26 10:40:02 +08:00
    @SlipStupig #30 简历驱动开发,学完 docker,搞上 jenkins,事成后,简历多好看,又会个技能。

    再一个 ,python 可能有环境变量 ,平台等不同导致一些包表现不同的情况。
    做预防最好的方法还会上 docker,保证运行环境一样。
    fiht
        33
    fiht  
       2021-04-26 11:04:00 +08:00
    docker + rancher

    每次打包生成新的 Tag 号,用过 rancher API 部署。
    除了问题可以直接回滚,很方便。
    WhoMercy
        34
    WhoMercy  
       2021-04-26 11:17:57 +08:00
    如果部署环境是离线的且和开发环境隔离,就没法使用 git,不好解决。
    SjwNo1
        35
    SjwNo1  
       2021-04-26 13:46:31 +08:00
    @z740713651 jenkins 对 python 项目友好吗 不太懂
    chenqh
        36
    chenqh  
       2021-04-26 13:54:02 +08:00
    @xiqingongzi 但是 docker 也需要私有镜像的吧,没有私有镜像怎么办?
    z740713651
        37
    z740713651  
       2021-04-26 14:10:15 +08:00
    @SjwNo1 #35 我这边只是个 CICD 的工具 还是挺好用的吧
    jenkins 只是说 测试-打包-发版-部署 都由 jenkins 的流水线来完成
    对其他语言项目应该都是一样的


    CICD 工具其实还有几个
    github 也有个 action 功能
    我个人的项目就白嫖 github 的这个功能了
    aristolochic
        38
    aristolochic  
       2021-04-26 14:30:21 +08:00
    以前 Ruby 生态搞出来的基于 ssh 的部署工具 Capistrano 流行过一段时间,依靠插件简化的部分大概是拉取版本管理系统的提交、保留多个版本供回滚用、多版本共享目录、自动运行 migration 等等,还有生成和自动重启中间件 /应用服务器( Python 的话就是 WSGI,Ruby 就是 Rack,PHP……是啥不知道,没用过) systemd 服务,还有生成 Nginx 配置啥的(不过感觉提供 systemd 和 Nginx 管理的插件就是用来给不怎么懂这些东西的人一个开箱即用的最佳实践,有需要可以手动编辑)。当时不止 Ruby on Rails 的人在用,PHP 和 Python 也有一些。当然现在也不是不能用,就是装 Ruby 和熟悉 Ruby 不是很多人都能接受(因为 Ruby 生态的东西,配置文件一般也是 Ruby 造的 DSL )

    小规模的话最好不用也没必要,但是理念可以参考一些,比如利用软链接在多个版本间共享前端资产、用户上传的图片等公共资源、数据库 Schema 和服务器 pid 和 socket 文件目录等等,不知道怎么写 Systemd service 也可以照抄,Nginx 配置也可以照抄(虽然现在可能用 Caddy 和 HAProxy 的多了?),还有写点脚本来搞点服务端的自动化之类的

    要是不痛恨 Docker 的话,就 Docker 得了
    tfdetang
        39
    tfdetang  
       2021-04-26 14:54:02 +08:00
    @SlipStupig 又不需要学的多精通。组里的实习生让他们花了 2 天看了下,基本就无障碍的使用了,能有多大成本
    xiqingongzi
        40
    xiqingongzi  
       2021-04-26 18:22:22 +08:00
    @chenqh 那就打包成 image,然后 export 为 tar
    然后在服务端再 load 进去就行,麻烦点,但可以实现。
    among
        41
    among  
       2021-04-26 21:35:31 +08:00
    建立私有 pip,依赖写在 requirements 里面,然后代码直接 svn update,后重启。

    新环境就直接 pip install -r requirements 后再做。
    treblex
        42
    treblex  
       2021-04-27 09:58:18 +08:00
    uwsgi 接管,写 nginx 配置,自动重启,然后直接 pull 代码,(之前看的 django 是这样的,这个框架没有测试过 ,可以看看这个 https://uwsgi-docs.readthedocs.io/en/latest/Tornado.html
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2696 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 10:47 · PVG 18:47 · LAX 02:47 · JFK 05:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.