Вывод списка переменных из внешнего скрипта python без встроенных и импортированных переменных - PullRequest
0 голосов
/ 23 сентября 2018

Я пишу скрипт 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 голосов
/ 23 сентября 2018

Это неясно, что вы пытаетесь сделать, но из этого описания, которое вы даете, эту проблему легче решить с помощью шаблонов, чем путем генерации кода с нуля в 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'>.Но тогда вы также должны выяснить, как отфильтровать функции, классы и т. Д.

...