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

Using a simple decorator, make your script a service running under:

  • Windows's scm
  • linux's systemd (needs additional testing)

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

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

main.py

from service_wrapper.windows 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
  • startup should be non-blocking (open threads/processes)
  • In linux function may be blocking
  • For blocking functions. look at Blocking Functions

Blocking functions


It is recommended to use a Generator as the decorated function but not required. in linux, a blocking function will behave normally. In order to decorate a blocking function in windows:

from service_wrapper.windows import as_service
from service_wrapper.windows import BlockingService


@as_service(
    SERVICE_NAME,
    SERVICE_DISPLAY_NAME,
    SERVICE_ENTRYPOINT_COMMAND,
    svc_class=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
  • svc_class attribute is not supported in linux

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.

For example, usage in CI with a tool like invoke

from pathlib import Path

from invoke import Context, task

from service_wrapper.windows import get_service
from service_wrapper.windows.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.3.tar.gz (7.3 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.3-cp312-cp312-win_amd64.whl (9.2 kB view details)

Uploaded CPython 3.12Windows x86-64

File details

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

File metadata

  • Download URL: service_wrapper-0.0.3.tar.gz
  • Upload date:
  • Size: 7.3 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.3.tar.gz
Algorithm Hash digest
SHA256 a0c1986cd74d3e471733a2e2cef8fa4f6aec30212f7c1489c9c83cedd8dc2bfc
MD5 b745880b38bc36a1519d44dbdc8b9396
BLAKE2b-256 5f34497aae99c250d5668da607879a8f0068e72a4fa077069ab977e671614d14

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for service_wrapper-0.0.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 28efff6ae7b0f37668272b82e51c1880a585902b92b53aa797130e8f43445999
MD5 25fa6dd7dbfe30145b3c3894555ecb71
BLAKE2b-256 87d2571a74b462bb79fea34b862fbfe8e38aa73215fe811b559a21c0c9bd1626

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