V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
CaptainD
V2EX  ›  问与答

Python 脚本直接的 import 管理

  •  
  •   CaptainD · 2023-03-18 22:29:40 +08:00 · 1079 次点击
    这是一个创建于 649 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近接手一项工作,管理某些 python 脚本,脚本越来越复杂,很难管理,想要优化下

    脚本特点

    • 脚本技术上很简单,大多是离线的批处理程序,诸如:

      • 读取本地文件,根据文件里的信息修改数据库某一批数据
      • 修改数据库某些字段格式
      • 根据某些字段计算新的字段
      • ...
    • 这些脚本大多数依赖手动执行,少部分是定时任务执行

    • 通常每个 module 里都有 main 函数,直接执行 main

    现在的做法

    • 直接 vscode 远程到服务器上,用命令执行某单个脚本,比如 python XXX.py + 参数

    问题:原来的程序很简单,可能只有寥寥几个文件,这样没有啥大问题,现在越来越复杂,很难使用

    • 很多公共的逻辑被抽取出来了,形成了很多 package ,在脚本里有很多 import ,因为之前是执行 module 的 main 函数,import 的公共 package 就需要在 sys.path 里面找,导致很多脚本需要在头文件加上 sys.path.append
    • 这样没有可移植性,项目结构一变就无法使用,很难维护
    2 条回复    2023-03-19 07:42:52 +08:00
    NoOneNoBody
        1
    NoOneNoBody  
       2023-03-19 01:35:45 +08:00   ❤️ 1
    分两种情况
    1.跨项目的公共代码打包成 package
    这个多留参数,变化宽松一些
    2.仅单一项目的公共代码,打包成一个公共目录或定点子目录
    这个如果前述 1.已经存在,但某些参数固定,可以写成一个闭包,或者继承并固定参数为新的类,供项目引入
    ClericPy
        2
    ClericPy  
       2023-03-19 07:42:52 +08:00   ❤️ 1
    1. 定时启动和手动调用, 以及分别查看运行记录和日志
    1.1 airflow, azkaban, systemd
    1.2 比较次的情况, APS Scheduler, sched, supervisor+plan
    1.3 不推荐 crontab

    2. 共享模块问题
    2.1 微服务(HTTP/RPC) 最能做好一致性和统一升级以及审计等能力
    2.2 云原生 Serverless 之类也不错, 打通 gateway 或者其他 invoke 方式也行
    2.3 私有 pypi 或者私有 git 用 pip 安装
    2.4 通过挂共享盘路径方式存放共享模块, 可以用统一的 venv, 也可以 sys.path 的方式, 包括 pip install -t /share_path/xxx 的方式带上依赖

    3. 解决上面脚本地狱的正经办法还是重构, 看成本是否能够接受吧
    3.1 领域驱动设计, 从头划分边界与共性
    3.2 服务化改造, 只通过 HTTP 或其他远程调用的方案, 起码把手动启动的改成远程调用
    3.3 调度模块按 1 里面的改造成所见即所得的模块, 而各种配置信息用专业的配置中心服务不要硬编码
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5336 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 07:24 · PVG 15:24 · LAX 23:24 · JFK 02:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.