列出外部脚本python中没有内置变量和导入变量的变量

时间:2018-09-23 02:52:35

标签: python import module metaprogramming airflow

我正在编写一个python脚本,该脚本从json文件获取参数,打开由一个参数(从一组选项中)指定的模板脚本,并生成一个新的python脚本,将其中的某些模板脚本替换为json中给出的参数。

我目前正在尝试列出模板中的所有变量,如下所示:

list = [item for item in dir(imported_script) if not item.startswith("__")]

因此,我可以使用列表对变量进行迭代,并将其写入新脚本中。

问题:此结果list还包含上述导入模板脚本中的导入模块。我也尝试过使用imported_script.__dict__vars(imported_script),但是这些解决方案的效果相同。还可以使用help(imported_script)返回脚本的元数据,但是直到现在我还没有找到正确的方法来获得与help(imported_script).DATA等效的方法。

问题:是否有一种更有效的方法来列出导入的脚本变量,这样我就可以得到用户声明的变量?

更多上下文::我正在使用Airflow生成工作流。 Airflow读取一个python脚本,该脚本指定应如何构建工作流程(在气流中称为DAG)。该脚本应位于特定的文件夹中,以便气流可以构成工作流程。在json文件中给出了如何构造工作流的规范,并且每次用户想要生成工作流时都会有所不同,因此我必须阅读此json文件,然后编写一个新脚本,以重复使用模板中的代码(至少有人告诉我这样做的方式)。我可以从中使用几个脚本来重复使用代码,将来还会有更多(动态的)脚本。选择的脚本取决于json中的参数之一。

1 个答案:

答案 0 :(得分:0)

目前尚不清楚您要做什么,但是从您给出的描述来看,使用模板解决此问题可能比通过在Python中完全从头生成代码更容易解​​决。您也许可以摆脱普通的旧python格式字符串,或者如果需要更多功能,jinja2可能会有用。

my_script.py.template

import something

{param1}_variable = 1
def {param2}_function():
    something.{something_func}

version_1.json

{
    'param1': 'foo',
    'param2': 'bar',
    'something_func': 'neato_function'
}

然后,您将生成类似以下内容的输出:

template = open('my_script.py.template').read()
with open('my_script_version_1.py', 'w') as f:
    f.write(template.format(**json.load(open('version_1.json'))))

所有这些...您是否超级确定要执行此操作?除非出于特殊原因需要生成包含代码的文件,否则最好使用更多标准方法(例如使用常规的Python导入)


要真正回答您的问题:您可以尝试在type的元素上使用vars()函数,但这似乎很脆弱。模块的类型为<class 'module'>。但是然后,您还必须弄清楚如何过滤掉函数,类等。