首页 > 解决方案 > 调用模块时如何将 XML 片段作为参数传递?

问题描述

我是 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)

在编码过程中出现了几个问题:

提前澄清几点:示例必须使用 FastAPI 实现,我不能使用 Docker / 它必须实现“独立的纯 Python”,并且必须使用 XML 而不是 JSON 或其他结构化文本格式。

如果这对我的问题来说是错误的地方,请不要犹豫,指出我正确的方向/正确的董事会。

标签: pythonxmlmicroservicesfastapi

解决方案


推荐阅读