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

如何通过代码实现把代码保存成 py 文件

  •  
  •   NeverBelieveMe · 2023-01-06 15:25:27 +08:00 · 3509 次点击
    这是一个创建于 669 天前的主题,其中的信息可能已经有所发展或是发生改变。

    场景

    通过代码生成 Airflow 的 DAG 文件。

    具体行为

    通过代码生成 python 脚本文件放到指定文件夹。脚本文件内部的代码整体上是差不多的,部分细节可能会差别比较大。

    我想到的做法

    dag_id = "test_one",
    task_id = "bash_task_one",
    echo_content = "hello"
    func_name = "func_one"
    func_content = """
    		print("world")
    """
    content = f'''
    from datetime import datetime
    from airflow import DAG
    from airflow.decorators import task
    from airflow.operators.bash import BashOperator
    
    with DAG(dag_id="{dag_id}",
             start_date=datetime(2022, 1, 1),
             schedule="0 0 * * *") as dag:
        hello = BashOperator(task_id="{task_id}", bash_command="echo {echo_content}")
    
    
        @task()
        def {func_name}():
            {func_content}
    
        hello >> {func_name}()
    
    '''
    with open('/root/dags/test.py', 'w', encoding='utf-8') as fb:
        fb.write(content)
    
    

    把代码放到多行字符串里,然后写到文件中。

    想到的问题

    • 需要提前把 function 的代码都抽象出来写好,而且不知道缩进会不会有影响

    求助

    不知道各位大佬们有没有什么好的建议

    14 条回复    2023-11-17 11:24:05 +08:00
    Alias4ck
        1
    Alias4ck  
       2023-01-06 15:48:08 +08:00
    如果文件内容差异不大 直接 jinjia 模板生成 应该就可以了吧
    NeverBelieveMe
        2
    NeverBelieveMe  
    OP
       2023-01-06 16:00:30 +08:00
    @Alias4ck 个人对 jinja 的理解是渲染 html 很好用,我这个要生成 py 文件,看起来好像帮助并不大。
    la2la
        3
    la2la  
       2023-01-06 16:26:18 +08:00
    根据不同的任务写不同的通用 py 脚本,通过参数传入 py 程序运行,然后就只用保存参数跟用那个脚本就好了
    zhangsanfeng2012
        4
    zhangsanfeng2012  
       2023-01-06 16:39:52 +08:00
    jinja 渲染一下就行了
    superrichman
        5
    superrichman  
       2023-01-06 16:47:24 +08:00
    jinja 是模板引擎,并没有限定只能给 html 用
    CnpPt
        6
    CnpPt  
       2023-01-06 16:52:24 +08:00
    如果你的需求是你的此文标题,那么你想到的做法没有问题。
    如果不是,请简述真实的需求,不然东问一句西问一句,大家都一脸懵逼
    learningman
        7
    learningman  
       2023-01-06 17:01:33 +08:00
    简单就模板渲染,复杂就上 AST 生成
    format < template < ast
    NeverBelieveMe
        8
    NeverBelieveMe  
    OP
       2023-01-06 17:07:18 +08:00
    @zhangsanfeng2012 @superrichman 我不太了解 jinja 模板,想问一下,渲染的时候,如果我把函数的代码渲染进去,会不会出现缩进不正常的问题?
    NeverBelieveMe
        9
    NeverBelieveMe  
    OP
       2023-01-06 17:12:27 +08:00
    @CnpPt 需求就是标题。我也知道自己的做法没有问题,只是想知道有没有更好的解决方案。
    NeverBelieveMe
        10
    NeverBelieveMe  
    OP
       2023-01-06 17:13:32 +08:00
    @la2la @learningman 多谢提供思路,我试试看。
    qza1212
        11
    qza1212  
       2023-01-06 18:45:33 +08:00
    用 C#写 T4 Text Templates
    zhuangzhuang1988
        12
    zhuangzhuang1988  
       2023-01-06 21:03:37 +08:00
    @qza1212
    也可以用 Java 写 stringtemplates
    可以看看这本书《编程语言实现模式》,第 12 章 使用模板生成 DSL 312
    https://book.douban.com/subject/10482195/
    qile11
        13
    qile11  
       2023-01-08 00:28:27 +08:00 via Android
    之前写了个 python 从网络下载 zip 压缩包,然后导入 zip 里面的文件,可是没登下载完毕就被杀毒软件杀啦,后来就没有从网络导入,直接编译一个 pyc 文件,更新时候手动替换
    hanssx
        14
    hanssx  
       354 天前
    最后老哥怎么处理的,我这比你这个还复杂,有多个 task 。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3171 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 12:36 · PVG 20:36 · LAX 04:36 · JFK 07:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.