Search code examples
pythontkintersubprocesspyinstaller

Python Tkinter with Flask API and Subprocess


Could I run a function from another python file inside subprocess?

I use pyinstaller to convert the tkinter to an executable file. As much as possible I would like to deploy/run the .exe file to another computer without installing python.

#gui.py
from tkinter import *
import os
import subprocess

root = Tk()
root.geometry("300x150")

def backendStart():
  subprocess.Popen(["test.py"], shell=True)

label = Label(root, text="Connection String", fg="grey", font=("Helvetica", 15, "bold"))
label.pack(pady=(0,3))


root.after_idle(backendStart)
root.mainloop()

Here is my sample app.py

from flask import Flask, jsonify
from flask_restful import Api, Resource
from flask_socketio import SocketIO, emit
from flask_cors import CORS
import random
from connection import cursor

app = Flask(__name__)
app.config["DEBUG"] = True
api = Api(app)
CORS(app)
socketio = SocketIO(app, cors_allowed_origins="*")

@socketio.on("connect")
def ClientConnection():
  print("Client is Connected")

@socketio.on("realtime", namespace="/sample-socket")
def RealTimeData():
  while True:
    num = random.randint(1, 100)
    emit("data", {"random": num})
    socketio.sleep(1)

@socketio.on("disconnect")
def ClientDisconnected():
  print("client has disconnected")

class HomePage(Resource):
  def get(self):
    return jsonify(msg="hello world")

api.add_resource(HomePage, "/")

if __name__ == '__main__':
  socketio.run(app, host="192.168.0.109", port=5000)

Currently I made a .spec file for configurating the names, logo, and files/libs included. The .exe file work as long as I pasted the app.py inside the build folder along with the connection.py for the database.

But with this set up I do need to install python along with the libraries I used for the app.py and connection.py


Solution

  • Could I run a function from another 
    python file inside subprocess?
    

    you can use multiprocessing.Process()

    Edit:
    For an expert's answer, see here
    Alternate solution:
    Lets say you want to run app.exe (which is app.py), you can pack all of them into one folder (--onedir) and put those exe's and pyd's subfolders.... together, like

    gui
    ----flask (and other folders)
    ----*.pyd
    ----app.exe
    ----gui.exe
    ----python39.dll
    

    you will need a custom spec file to do that.
    see https://pyinstaller.readthedocs.io/en/stable/spec-files.html#multipackage-bundles