Search code examples
pythonwindowslaunch

Tracking application launched with a python file


I've encountered a situation where I thought it would be a good idea to create a launcher for an application which I tend to run several instances of. This is to ensure that I and the application get access to the wanted environment variables that can be provided and set for each instance.

import os
import subprocess


def launch():
    """
    Launches application.
    """
    # create environment
    os.environ['APPLICATION_ENVIRON'] = 'usr/path'

    # launch application
    application_path = 'path/to/application'
    app = subprocess.Popen([application_path])
    pid = app.pid
    app.wait()

    print 'done with process: {}'.format(pid)


if __name__ == '__main__':
    launch()

I want to be able to track the applications, do I dump the pids in a file and remove them when the process closes? Do I launch a service that I communicate with?

Being fairly new to programming in general I don't know if I'm missing a term in the lingo or just thinking wrong. But I was reading up on Daemons and services to track the applications and couldn't come up with a proper answer. Put simply, a bit lost how to approach it.


Solution

  • What you're doing already seems reasonable. I'd probably extend it to something like this:

    import os
    import subprocess
    
    
    def launch_app():
        os.environ['APPLICATION_ENVIRON'] = 'usr/path'
        application_path = 'path/to/application'
        return subprocess.Popen([application_path])
    
    
    def _purge_finished_apps(apps):
        still_running = set()
        for app in apps:
            return_code = app.poll()
            if return_code is not None:
                print "  PID {} no longer running (return code {})".format(app.pid, return_code)
            else:
                still_running.add(app)
        return still_running
    
    
    def ui():
        apps = set()
    
        while True:
            print
            print "1. To launch new instance"
            print "2. To view all instances"
            print "3. To exit, terminating all running instances"
            print "4. To exit, leaving instances running"
            opt = int(raw_input())
    
            apps = _purge_finished_apps(apps)
    
            if opt == 1:
                app = launch_app()
                apps.add(app)
                print "  PID {} launched".format(app.pid)
    
            elif opt == 2:
                if not apps:
                    print "There are no instances running"
                for app in apps:
                    print "  PID {} running".format(app.pid)
    
            elif opt == 3:
                for app in apps:
                    print "Terminating PID {}".format(app.pid)
                    app.terminate()
                for app in apps:
                    app.wait()
                    print "PID {} finished".format(app.pid)
                return
    
            elif opt == 4:
                return
    
    
    if __name__ == "__main__":
        ui()