Skip to main content

Making services easy

Project description

Service Wrapper

A python tool to easily create services running under the os's service management source code

Function as a service

Make a script into a service running under Windows's scm (linux WIP) using a simple decorator.

Intended to work with PyInstaller (or alternatives) to create an executable that can be registered under scm.

python main.py still works. Function will block until KeyboardInterrupt is received.

main.py

from service_wrapper import as_service

@as_service(SERVICE_NAME, SERVICE_DISPLAY_NAME, SERVICE_ENTRYPOINT_COMMAND)
def main():
    startup()
    try:
        yield
    finally:
        cleanup()

if __name__ == "__main__":
    main()

NOTES:

  • The decorated function should not accept arguments
  • The startup should be non-blocking (open threads/processes).
  • For blocking functions look at Blocking Functions

Blocking functions


It is recommended to use a Generator as the decorated function but not required. In order to decorate a blocking function:

from service_wrapper import as_service
from service_wrapper.ext import BlockingService


@as_service(
    SERVICE_NAME,
    SERVICE_DISPLAY_NAME,
    SERVICE_ENTRYPOINT_COMMAND,
    base=BlockingService,
)
def main():
    run_logic()
    
if __name__ == "__main__":
    main()

NOTES:

  • When invoked using scm (PyInstalled and installed as a service), BlockingService will run main() is a separate spawned process.
  • SIGINT will be sent to that process the scm stop is called

Service Tooling

Controls for installing\removing the service are provided using the ServiceTools.

They are to be used externally in scripts to streamline installation\removal etc.

Should be used with tools like invoke

from pathlib import Path

from invoke import Context, task

from service_wrapper import get_service
from service_wrapper.service_tools import ServiceTools

service_tools = ServiceTools(get_service(main))

EXECUTABLE_PATH = Path("./dist/svc.exe")


@task()
def build(context: Context) -> None:
    context.run(
        f"pyinstaller "
        f"--onefile "
        f"--name=svc "
        f"main.py"
    )


@task(build)
def install(_: Context) -> None:
    service_tools.install_service(EXECUTABLE_PATH)


@task
def restart(_: Context) -> None:
    service_tools.stop_service()
    service_tools.start_service()

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

service_wrapper-0.0.1.tar.gz (4.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

service_wrapper-0.0.1-cp312-cp312-win_amd64.whl (6.7 kB view details)

Uploaded CPython 3.12Windows x86-64

File details

Details for the file service_wrapper-0.0.1.tar.gz.

File metadata

  • Download URL: service_wrapper-0.0.1.tar.gz
  • Upload date:
  • Size: 4.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: pdm/2.22.2 CPython/3.12.7 Windows/11

File hashes

Hashes for service_wrapper-0.0.1.tar.gz
Algorithm Hash digest
SHA256 f83de86c83dd7c899bb83c60b0cb96c9b22e1f2293f62e5faeb993e292981ba0
MD5 d47280998c342d9652a7b5185bff4001
BLAKE2b-256 8b1a2790914e924da6272dcb4af3471ed7ffdb5b2b9ec31bc1c524f41ab3a894

See more details on using hashes here.

File details

Details for the file service_wrapper-0.0.1-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for service_wrapper-0.0.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 4dabac299f1a6cc079974013c6c10dc2914dbbd8f2cfc8b837b914ab965b51f2
MD5 824c060bf26b453a2c9f3ccb88c25e20
BLAKE2b-256 c44c9dce9d8962efada4d7549627c3a295a973ad019473efd8bfe29b091d0984

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page