I’m trying to combine backend and frontend.

I’ve created a frontend using PyQt webbrowser:

from PySide2.QtCore import *
from PySide2.QtWidgets import *
from PySide2.QtGui import *
from PySide2.QtWebEngineWidgets import *

import sys


class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
        self.browser = QWebEngineView()
        self.browser.setBaseSize(800, 600)
        self.browser.setUrl(QUrl("http://127.0.0.1:8000/"))
        self.setCentralWidget(self.browser)
        self.show()


def gui_main():
    app = QApplication(sys.argv)
    window = MainWindow()
    app.exec_()


if __name__ == "__main__":
    gui_main()

The backend is using fastapi:

from typing import Union
from fastapi import FastAPI
app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}

def backend():
    import uvicorn
    uvicorn.run(app)

So far, everything is good. I can launch backend and start debugging: uvicorn backend:app

But when I tried to create a single executable using pyinstaller: pyinstaller --onefile main.py

The main.py just launches backend and frontend:

from backend import backend
from gui import gui_main

import multiprocessing

if __name__ == "__main__":
    p = multiprocessing.Process(target=backend)
    p.start()
    gui_main()

The resulting app keep poping up windows and exausted all memory.

I’ve tried to restart computer, but the issue remains the same.


A simple search query like “pyinstaller multiprocessing” should suffice: Common Issues and Pitfalls: “A typical symptom of failing to call multiprocessing.freeze_support() before your code […] attempts to make use of multiprocessing functionality is an endless spawn loop of your application process.”