Возьмите любую интерпретацию web-сервера на питоне и отдавайте формируемый файл через него.
Например через aiohttp (проверил, рабочий)
from aiohttp import web
from concurrent.futures import ThreadPoolExecutor
import xml.etree.ElementTree as ElementTree
def get_xml():
root = ElementTree.Element('root')
b = ElementTree.SubElement(root, 'b')
c = ElementTree.SubElement(root, 'c')
d = ElementTree.SubElement(root, 'd')
xmlstr = ElementTree.tostring(root, encoding='utf8', method='xml')
return xmlstr
async def handle(request):
with ThreadPoolExecutor() as executor:
xmlstr = await request.app.loop.run_in_executor(executor, get_xml)
return web.Response(body=xmlstr, content_type="text/xml")
app = web.Application()
app.router.add_get('/', handle)
web.run_app(app, port=8080)