How to bypass the 0-255 range limit for sys.exit() in python?
In python (on a Linux system), I'm launching a command using os.system()
and retrieving the return code. If that return code is different from 0, I would like to make the program exit with that same return code. So I wrote:
ret = os.system(cmd)
if ret != 0:
print "exit with status %s" % ret
sys.exit(ret)
When the return code is lower than 256, it works fine, but when it's greater than 255, the exit code used is 0. How can I make sys.exit() accept codes greater than 255?
Edit: the limit is actually 255
In fact, the ret
variable receives 256, but sys.exit()
fails to use it, so the program returns 0 instead. When I launch cmd
manually, I see that it returns 1, not 256.
Asked by: Catherine606 | Posted: 06-12-2021
Answer 1
Actually, the documentation indicates that
exit status indication: a 16-bit number, whose low byte is the signal number that killed the process, and whose high byte is the exit status (if the signal number is zero); the high bit of the low byte is set if a core file was produced.
So I need to process the number returned by sys.exit() in order to retrieve the real exit status, like so:
ret = os.system(cmd)
# Ignore the first byte, use the second one only
ret = ret >> 8
if ret != 0:
print "exit with status %s" % ret
sys.exit(ret)
And now it works: ret contains 1 instead of 256.
Answered by: Arthur198 | Posted: 07-01-2022Answer 2
You can't shouldn't, because the system reserves exit codes above 128 for itself. If the return code is from 0 to 127, it means that the program exited by itself. If the return code is higher than 128, it means that the program was terminated by a system signal (e.g. SIGKILL or SIGTERM). The signal number is the result code minus 128.
You'll need to detect it and make some other kind of output indication, I think. Perhaps print the return code to STDOUT and then return with either 0 (normal exit, normal output) or 1 (cmd had a non-zero return value, output means something).
edit: Apparently (from this comment), Python is more clever than a shell script... To put it back into a regular Linux exit code, try this:
subprocess_exit_code = (ret >> 8) & 0x7f
subprocess_signal_number = ret & 0xff
if subpprocess_signal_number == 0:
exit_code = subprocess_exit_code
else:
exit_code = 128 + subprocess_signal_number
Although this ignores the core-dump information.
Answered by: Adelaide347 | Posted: 07-01-2022Answer 3
Works for me (CentOS 5.5, Python 2.6.5):
$ python
>>> import sys
>>> sys.exit(245)
$ echo $?
245
Answered by: Haris468 | Posted: 07-01-2022
Similar questions
python - Unittest causing sys.exit()
No matter what I do sys.exit() is called by unittest, even the most trivial examples. I can't tell if my install is messed up or what is going on.
IDLE 1.2.2 ==== No Subprocess ====
>>> import unittest
>>>
>>> class Test(unittest.TestCase):
def testA(self):
a = 1
self.assertEqual(a,1)
>>> unittest.main()
option -n not recognized
Usa...
python - Handle sys.exit() in cherrypy service
When you start/stop a python cherrypy service (compiled with py2exe), this works fine When I get a sys.exit() call (from my error handler), cherrypy quits, but the service remains hanging.
Code:
import cherrypy
import win32serviceutil
import win32service
import sys
SERVICE = None
class HelloWorld:
""" Sample request handler class. """
def __init__(self):
self.iVal = ...
Python sys.exit() help?
I am working in Python and am trying to have a line of code execute and after it executes I am calling sys.exit() to have the script itself "exit." However, it seems that sys.exit() is executing before the line of code above it executes. Below is the code I am trying to implement:
if something == True:
self.redirect('http://www.google.com/')
sys.exit()
The...
mocking - How to get around "sys.exit()" in python nosetest?
It seems that python nosetest will quit when encountered sys.exit(), and mocking of this builtin doesn't work.
import - python: Importing scipy.io seems to prevent sys.exit() to work properly
Under Windows, executing the following Python script I get an ERRORLEVEL of 0 instead of the expected 2.
import sys
import scipy.io
sys.exit(2)
If I remove the import scipy.io, I got the correct ERRORLEVEL of 2...
Any idea why importing scipy.io cause such an issue?
PS: windows 7, python 2.72, scipy 0.10.1
Calling help(sys.exit) just before the sys.exit call return...
python - Issue with sys.exit() in pygame
I am learning to use Pygame, and when I use sys.exit(), I run into a problem. Here is the code:
import pygame, sys,os
from pygame.locals import *
pygame.init()
window = pygame.display.set_mode((468, 60))
pygame.display.set_caption('Game')
screen = pygame.display.get_surface()
file_name = os.path.join("data","image.bmp")
surface = pygame.image.load(file_name)
screen.blit(surface, (0,0)...
python - Why are the methods sys.exit(), exit(), raise SystemExit not working?
I need an alternative to kill the python script while inside a thread function. My intention is killing the server when the client enters a 0... Is this not working because the threads haven't been terminated? Here is my code:
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM);
print 'Socket created'
try:
socket.bind((HOST, PORT))
except socket.error, message:
print 'Bind statement failed. ...
How to use sys.exit() in Python
player_input = '' # This has to be initialized for the loop
while player_input != 0:
player_input = str(input('Roll or quit (r or q)'))
if player_input == q: # This will break the loop if the player decides to quit
print("Now let's see if I can beat your score of", player)
break
if player_input != r:
print('invalid choice, try again')
if player_input ==r:
roll...
python - Is it possible for a unit test to assert that a method calls sys.exit()?
I have a Python 2.7 method that sometimes calls
sys.exit(1)
Is it possible to make a unit test that verifies this line of code is called when the right conditions are met?
python - how to continue execution after sys.exit() command
Here i'm reading and comparing values from the two logs using 'for' loop.Problem is i'm not able to continue to next TC after sys.exit command. Let me know if required more clarification
f = open('/tmp/ftplog', 'r')
for line in f:
m = re.findall("5\d+", line)
#print m
fd = open('/tmp/tellog', 'r')
for line in fd:
n = re.findall(r"5\d+", line)
#prin...
Still can't find your answer? Check out these communities...
PySlackers | Full Stack Python | NHS Python | Pythonist Cafe | Hacker Earth | Discord Python