Как я могу передать фрагмент XML в качестве параметра при вызове модуля?

#python #xml #microservices #fastapi

Вопрос:

Я новичок в Python и пытаюсь настроить небольшой пример микросервиса с помощью FastAPI.

Настройка микросервиса настраивается с помощью XML-файла конфигурации:

 <?xml version="1.0" encoding="utf-8"?>
<config>
  <service name="Watch folder">
    <module name="folder_watcher">
      <port>8001</port>
      <folder>folder/to/watch</folder>
      <interval>5s</interval>
    </module>
  </service>
</config>
 

Основной модуль читается так (все еще продолжается работа):

 import defusedxml.ElementTree
import subprocess
import pathlib
import os

SERVICE_DIR = 'service'

def launchService(service):
  print('Service: '   service.attrib['name'])
  for module in service.findall('./module'):
    module_name = module.attrib['name']
    print('* Module: '   module_name)
    parameters = module.findall('./*')
    for parameter in parameters:
      print('  * '   parameter.tag   ': '   parameter.text)
    folder_path = pathlib.Path(__file__).parent.resolve()
    command = os.path.join('python ', folder_path, SERVICE_DIR, module_name, 'main.py')
    print('* Command: '   command)
    subprocess.Popen(command, parameters)

def loadConfig():
  # config.xml
  elementTree = defusedxml.ElementTree.parse('config.xml')
  for service in elementTree.findall('./service'):
    launchService(service)

if __name__ == "__main__":
  loadConfig()
 

И модуль folder_watcher main.py читает

 import sys
from fastapi import FastAPI
import uvicorn

service = FastAPI()

@service.get("/")
async def root():
  return {"Message": "Hello World!"}

if __name__ == "__main__":
  parameters = sys.argv[1]
  for parameter in parameters:
      print('  * '   parameter.tag   ': '   parameter.text)
  uvicorn.run(service, host="localhost", port=8000)
 

Во время кодирования этого:

  • Является subprocess.Popen ли правильным способом вызова микросервисов?
  • Как я могу предоставить фрагмент XML для конфигурации службы в качестве параметра?
  • Есть ли другие вещи, которые я мог бы проследить?

Просто чтобы заранее прояснить несколько вещей: пример должен быть реализован с помощью FastAPI, я не могу использовать Docker / он должен быть реализован «автономным чистым Python», и он должен использовать XML, а не JSON или другие структурированные текстовые форматы.

Если это неправильное место для моего вопроса, пожалуйста, не стесняйтесь указывать мне правильное направление / правильную доску.

Комментарии:

1. Командная строка-не лучший способ передать что-то вроде фрагмента xml, и было бы лучше использовать файл.

2. Пример не подразумевает никакого взаимодействия с командной строкой. Я вызываю модуль из основного модуля, и мне нужно передать фрагмент XML в вызываемый модуль. Передача файла также не помогает, и повторный просмотр файла конфигурации также не является вариантом.

3. Принятые параметры subprocess.Popen() похожи на использование аргументов командной строки. Если используемые вами модули предназначены для программного запуска, должна быть какая-то документация о том, что они ожидают или принимают для передачи, как обычно, в справке «использование», которую вы получаете.

4. Я понимаю. Могу ли я позвонить в модуль main.py и передать XML-фрагмент другим способом? Существуют ли рекомендации по передаче сложных типов данных в качестве параметров модулям? uvicorn Порождает ли свой собственный подпроцесс, который может subprocess.Popen() устареть?

5. Я не знаю, как uvicorn это работает. Насколько я знаю, лучшая практика передачи сложных аргументов, подобных этому, — это использование файлов, как я сказал в своем первоначальном комментарии. Вы можете использовать tempfile модуль для создания файлов для этой цели.