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

2023-01-06 15:25:27 +08:00
 NeverBelieveMe

场景

通过代码生成 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)

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

想到的问题

求助

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

3300 次点击
所在节点    Python
14 条回复
Alias4ck
2023-01-06 15:48:08 +08:00
如果文件内容差异不大 直接 jinjia 模板生成 应该就可以了吧
NeverBelieveMe
2023-01-06 16:00:30 +08:00
@Alias4ck 个人对 jinja 的理解是渲染 html 很好用,我这个要生成 py 文件,看起来好像帮助并不大。
la2la
2023-01-06 16:26:18 +08:00
根据不同的任务写不同的通用 py 脚本,通过参数传入 py 程序运行,然后就只用保存参数跟用那个脚本就好了
zhangsanfeng2012
2023-01-06 16:39:52 +08:00
jinja 渲染一下就行了
superrichman
2023-01-06 16:47:24 +08:00
jinja 是模板引擎,并没有限定只能给 html 用
CnpPt
2023-01-06 16:52:24 +08:00
如果你的需求是你的此文标题,那么你想到的做法没有问题。
如果不是,请简述真实的需求,不然东问一句西问一句,大家都一脸懵逼
learningman
2023-01-06 17:01:33 +08:00
简单就模板渲染,复杂就上 AST 生成
format < template < ast
NeverBelieveMe
2023-01-06 17:07:18 +08:00
@zhangsanfeng2012 @superrichman 我不太了解 jinja 模板,想问一下,渲染的时候,如果我把函数的代码渲染进去,会不会出现缩进不正常的问题?
NeverBelieveMe
2023-01-06 17:12:27 +08:00
@CnpPt 需求就是标题。我也知道自己的做法没有问题,只是想知道有没有更好的解决方案。
NeverBelieveMe
2023-01-06 17:13:32 +08:00
@la2la @learningman 多谢提供思路,我试试看。
qza1212
2023-01-06 18:45:33 +08:00
用 C#写 T4 Text Templates
zhuangzhuang1988
2023-01-06 21:03:37 +08:00
@qza1212
也可以用 Java 写 stringtemplates
可以看看这本书《编程语言实现模式》,第 12 章 使用模板生成 DSL 312
https://book.douban.com/subject/10482195/
qile11
2023-01-08 00:28:27 +08:00
之前写了个 python 从网络下载 zip 压缩包,然后导入 zip 里面的文件,可是没登下载完毕就被杀毒软件杀啦,后来就没有从网络导入,直接编译一个 pyc 文件,更新时候手动替换
hanssx
165 天前
最后老哥怎么处理的,我这比你这个还复杂,有多个 task 。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/907011

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX