Как импортировать скрипт Python и передать аргументы в основную функцию - PullRequest
0 голосов
/ 16 января 2019

У меня есть два сценария Python. Основной скрипт вызывает generate.py, у которого есть основная функция, которая принимает 3 аргумента из argsparse. То, что я пытаюсь сделать, это импортировать generate.py в main.py. Вызовите функцию main из generate.py, но передайте ей три аргумента, чтобы она могла выполнить функцию main с этими аргументами.

Три аргумента: путь, файлы и данные.

Путь - это просто путь к данным файлы, по сути, для цикла цикла через файлы в каталоге data - это папка с файлами json

Пока мой скрипт main.py выглядит следующим образом. :

def get_json_location(username=os.getlogin()):
  first = "/Users/"
  last = "/Desktop/data-code/Testdata"
  result = first + username + last
return result


def get_config():
  parser = argparse.ArgumentParser()
  parser.add_argument("-p", "--parameter-file", action="store", required=False)
  parser.add_argument("-e", "--export-data-file", action="store", required=False)
  parser.add_argument("-d", "--export-date", action="store", required=False)
  args = parser.parse_args()

  return [args.parameter_file, args.export_data_file, args.export_date]

  path, files, data = get_config()

  date = get_config()[2]
  yml_directory = os.listdir('yaml')
  yml_directory.remove('export_config.yaml')


def generate_json():
  with open('dates/' + date + '.json', 'w') as start:
  start.close()

  for yml in yml_directory :
  print("Running export for " + yml)


  # Here is the script that i am calling but i want to pass the parameters path , file and data_folder
  gen_json.main(path,files,data)



  if __name__ == '__main__':
  generate_json()

generate.py выглядит следующим образом:

def main(get_config):
  cfg = get_config()[0] # json location
  data = get_config()[1] # export_agent_core_agent.yaml
  date = get_config()[2] # synthetic data folder - YYYY-MM-DD


json_location = cfg
json_database = data["config"]["database"]
json_collection = data["config"]["collection"]
json_path = "{0}/{1}{2}/{3}/{3}.json".format(json_location, date, json_database, json_collection)

def get_config():
  parser = argparse.ArgumentParser()
  parser.add_argument("-p", "--parameter-file", action="store", required=True)
  parser.add_argument("-e", "--export-data-file", action="store", required=True)
  parser.add_argument("-d", "--export-date", action="store", required=True)
  args = parser.parse_args()

  return [args.parameter_file, funcs.read_config(args.export_data_file), args.export_date]


if __name__ == "__main__":
  logging.getLogger().setLevel(logging.INFO)
  main(get_config)

1 Ответ

0 голосов
/ 17 января 2019

Подумайте о рефакторинге вашего кода!

Чтобы ответить на ваш вопрос, вы можете передать строку от main.py до gen_json.main('...') и далее до gen_json.get_config('...'). Argparse оценит эту строку, которую нужно разбить на список.
Вы по-прежнему можете вызывать generate.py с параметрами командной строки.

Обратите внимание, что я удалил ненужный / неправильный код / ​​идентификацию , чтобы показать, как это может работать в принципе.

generate.py:

import argparse
import sys


def main(cliParams=None):
  cfg, data, date = get_config(cliParams)
  print (cfg, data, date)

  #json_location = cfg
  #json_database = data["config"]["database"]
  #json_collection = data["config"]["collection"]
  #json_path = "{0}/{1}{2}/{3}/{3}.json".format(json_location, date, json_database, json_collection)
  #print json_path

def get_config(cliParams=None):
  parser = argparse.ArgumentParser()
  parser.add_argument("-p", "--parameter-file", action="store", required=True)
  parser.add_argument("-e", "--export-data-file", action="store", required=True)
  parser.add_argument("-d", "--export-date", action="store", required=True)

  if not cliParams:
    args = parser.parse_args()
  else:
    args = parser.parse_args(cliParams.split())
  #return [args.parameter_file, funcs.read_config(args.export_data_file), args.export_date]
  return [args.parameter_file, args.export_data_file, args.export_date]


if __name__ == "__main__":
  logging.getLogger().setLevel(logging.INFO)
  main()

main.py:

import os
import generate as gen_json

def generate_json():
  path = '/tmp/foo.yml'
  data = 'export_agent_core_agent.yaml'
  date = '2019-01-15'

  argParseString = '-p %s -e %s -d %s' % (path, data, date)
  gen_json.main(argParseString)

if __name__ == '__main__':
  generate_json()

Печать на стандартный вывод:

>>> /tmp/foo.yml export_agent_core_agent.yaml 2019-01-15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...