_exit.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. # -*- test-case-name: twisted.application.runner.test.test_exit -*-
  2. # Copyright (c) Twisted Matrix Laboratories.
  3. # See LICENSE for details.
  4. """
  5. System exit support.
  6. """
  7. import typing
  8. from enum import IntEnum
  9. from sys import exit as sysexit, stderr, stdout
  10. from typing import Union
  11. try:
  12. import posix as Status
  13. except ImportError:
  14. class Status: # type: ignore[no-redef]
  15. """
  16. Object to hang C{EX_*} values off of as a substitute for L{posix}.
  17. """
  18. EX__BASE = 64
  19. EX_OK = 0
  20. EX_USAGE = EX__BASE
  21. EX_DATAERR = EX__BASE + 1
  22. EX_NOINPUT = EX__BASE + 2
  23. EX_NOUSER = EX__BASE + 3
  24. EX_NOHOST = EX__BASE + 4
  25. EX_UNAVAILABLE = EX__BASE + 5
  26. EX_SOFTWARE = EX__BASE + 6
  27. EX_OSERR = EX__BASE + 7
  28. EX_OSFILE = EX__BASE + 8
  29. EX_CANTCREAT = EX__BASE + 9
  30. EX_IOERR = EX__BASE + 10
  31. EX_TEMPFAIL = EX__BASE + 11
  32. EX_PROTOCOL = EX__BASE + 12
  33. EX_NOPERM = EX__BASE + 13
  34. EX_CONFIG = EX__BASE + 14
  35. class ExitStatus(IntEnum):
  36. """
  37. Standard exit status codes for system programs.
  38. @cvar EX_OK: Successful termination.
  39. @cvar EX_USAGE: Command line usage error.
  40. @cvar EX_DATAERR: Data format error.
  41. @cvar EX_NOINPUT: Cannot open input.
  42. @cvar EX_NOUSER: Addressee unknown.
  43. @cvar EX_NOHOST: Host name unknown.
  44. @cvar EX_UNAVAILABLE: Service unavailable.
  45. @cvar EX_SOFTWARE: Internal software error.
  46. @cvar EX_OSERR: System error (e.g., can't fork).
  47. @cvar EX_OSFILE: Critical OS file missing.
  48. @cvar EX_CANTCREAT: Can't create (user) output file.
  49. @cvar EX_IOERR: Input/output error.
  50. @cvar EX_TEMPFAIL: Temporary failure; the user is invited to retry.
  51. @cvar EX_PROTOCOL: Remote error in protocol.
  52. @cvar EX_NOPERM: Permission denied.
  53. @cvar EX_CONFIG: Configuration error.
  54. """
  55. EX_OK = Status.EX_OK
  56. EX_USAGE = Status.EX_USAGE
  57. EX_DATAERR = Status.EX_DATAERR
  58. EX_NOINPUT = Status.EX_NOINPUT
  59. EX_NOUSER = Status.EX_NOUSER
  60. EX_NOHOST = Status.EX_NOHOST
  61. EX_UNAVAILABLE = Status.EX_UNAVAILABLE
  62. EX_SOFTWARE = Status.EX_SOFTWARE
  63. EX_OSERR = Status.EX_OSERR
  64. EX_OSFILE = Status.EX_OSFILE
  65. EX_CANTCREAT = Status.EX_CANTCREAT
  66. EX_IOERR = Status.EX_IOERR
  67. EX_TEMPFAIL = Status.EX_TEMPFAIL
  68. EX_PROTOCOL = Status.EX_PROTOCOL
  69. EX_NOPERM = Status.EX_NOPERM
  70. EX_CONFIG = Status.EX_CONFIG
  71. def exit(status: Union[int, ExitStatus], message: str = "") -> "typing.NoReturn":
  72. """
  73. Exit the python interpreter with the given status and an optional message.
  74. @param status: An exit status. An appropriate value from L{ExitStatus} is
  75. recommended.
  76. @param message: An optional message to print.
  77. """
  78. if message:
  79. if status == ExitStatus.EX_OK:
  80. out = stdout
  81. else:
  82. out = stderr
  83. out.write(message)
  84. out.write("\n")
  85. sysexit(status)