commands.getstatusoutput result is not command line exit value!!!

Hari Sekhon hpsekhon at googlemail.com
Mon Oct 2 17:57:52 CEST 2006


I'm sorry, this may seem dense to you but I have to ask. What on earth 
are you talking about?

Why is it shifted 8 bits to the left? Why is there bitshifting at all? 
Why doesn't commands give the same exit value as os.system() and the 
unix cli?

When you choose to exit a program you give it a return value to exit 
with, so why would this change, I exit with the number 1 then expect 
that number to be the exit code, right? Where do these higher numbers 
come into the equation and why?

Please assume that I am not a mind reader and require explanation before 
I can understand.

Perhaps you aren't a mind reader either and don't know why the writers 
of the commands lib chose to do this insanity either? It seems the 
os.system() guys did the right thing, I wonder why 
commands.getstatusoutput doesn't...

Having just tested it manually with a shell script returning 2, 
commands.getstatusoutput did give the exit code as 512, so it does seem 
to generically shift the exit code 8 bits to the left or multiply it by 
256 for those of us who need some more straight talking...

ugg, perhaps it's time to stop using this thing and use a better lib module.

any explanations welcome...

-h

Hari Sekhon



Steve Holden wrote:
> A famous Holden typo - it should have been "12 * 256 == 3072", but 
> really it shouldn't have been beyond you to perform a division of 3072 
> by 12 (given that you already knew the number 12 was potentially 
> involved).
>
> Basically the value you want is shifted up 8 bits. Perhaps I should 
> more understandably have said:
>
>   12 << 8 == 3072
>
> regards
>  Steve
>
> Hari Sekhon wrote:
>> I don't quite understand what you are saying here:
>>
>> 2 * 256 is 512,
>> 2 ** 256 is some extremely large number.
>>
>> 2**12 is 4096.
>>
>> So how does 3072 factor into this?
>>
>> Could you explain what you mean by "the error in the top half of a 
>> sixteen-bit value"?
>>
>> This makes no sense to me at this moment.
>>
>> -h
>>
>> Hari Sekhon
>>
>>
>>
>> Steve Holden wrote:
>>
>>> Hari Sekhon wrote:
>>>  
>>>
>>>> I'm running a command like
>>>>
>>>> import commands
>>>> result = commands.getstatusoutput('somecommand')
>>>> print result[0]
>>>> 3072
>>>>
>>>>
>>>> However, this exit code made no sense so I ran it manually from the 
>>>> command line in bash on my linux server and it gives the exit code 
>>>> as 12, not this weird 3072 number.
>>>>
>>>> So I tried os.system('somecommand') in the interactive python shell 
>>>> and it too returned the same result for the exit code as the unix 
>>>> shell, 12, but re-running the commands.getstatusoutput() with the 
>>>> exact same command still gave 3072.
>>>>
>>>>
>>>> Is commands.getstatusoutput() broken or something?
>>>>
>>>>
>>>> -h
>>>>
>>>>   
>>> No, it's just returning the error code in the top half of a 
>>> sixteen-bit value. You will notice that 3072 == 2 * 256.
>>>
>>> That's always been the way the Unix return code has been returned 
>>> programattically, but the shell shifts it down to make it more usab;e.
>>>
>>> regards
>>>  Steve
>>>  
>>>
>
>



More information about the Python-list mailing list