Detecting 64bit vs. 32bit Linux

D

dwelch91

I need to detect whether the operating system I am running on (not the
Python version) is 64bit or 32bit. One requirement is that I need to
include support for non-Intel/AMD architectures.

The 2 ways I have thought detecting 64bit are:

1. struct.calcsize("P") == 8
2. '64' in os.uname()[4]

I'm not convinced that either one of these is really adequate. Does
anybody have any other ideas on how to do this?

Thanks,

Don
 
J

Jim Segrave

I need to detect whether the operating system I am running on (not the
Python version) is 64bit or 32bit. One requirement is that I need to
include support for non-Intel/AMD architectures.

The 2 ways I have thought detecting 64bit are:

1. struct.calcsize("P") == 8
2. '64' in os.uname()[4]

I'm not convinced that either one of these is really adequate. Does
anybody have any other ideas on how to do this?

Does sys.maxint give what you need?

I think for most machines this will give you the answer you are
looking for - either 2**31 -1 for a 32 bit version or 2**63-1 for a 64
bit version. It's set up during the configure phase of building python

If you want to detect a 64bit OS running a compatibility mode for a 32
bit version of Python, then you'll need to figure out how to build and
incorporate a Python extension which can detect this situation
 
M

MrJean1

Try function architecture() from the platform module in Python 2.3 and
2.4. The first item of the returned tuple shows whether the underlying
system is 64-bit capable.

Here is what it returns on RedHat Fedora Core 2 Linux on Opteron:
('Linux', 'XXXX', '2.6.16.14', '#1 SMP Sat Jul 1 14:09:18 CDT 2006',
'x86_64', 'x86_64')


('Linux', 'XXXX', '2.6.10-1771-FC2', '#1 Mon Mar 28 00:50:14 EST 2005',
'i686', 'i686')


And on MacOS X 10.3.9 G4:
('Darwin', 'XXXX', '7.9.0', 'Darwin Kernel Version 7.9.0: Wed Mar 30
20:11:17 PST 2005; root:xnu/xnu-517.12.7.obj~1/RELEASE_PPC ', 'Power
Macintosh', 'powerpc')


/Jean Brouwers


I need to detect whether the operating system I am running on (not the
Python version) is 64bit or 32bit. One requirement is that I need to
include support for non-Intel/AMD architectures.

The 2 ways I have thought detecting 64bit are:

1. struct.calcsize("P") == 8
2. '64' in os.uname()[4]

I'm not convinced that either one of these is really adequate. Does
anybody have any other ideas on how to do this?

Thanks,

Don
 
P

Paul McGuire

MrJean1 said:
Try function architecture() from the platform module in Python 2.3 and
2.4. The first item of the returned tuple shows whether the underlying
system is 64-bit capable.

Here is what it returns on RedHat Fedora Core 2 Linux on Opteron:

('Linux', 'XXXX', '2.6.16.14', '#1 SMP Sat Jul 1 14:09:18 CDT 2006',
'x86_64', 'x86_64')



('Linux', 'XXXX', '2.6.10-1771-FC2', '#1 Mon Mar 28 00:50:14 EST 2005',
'i686', 'i686')


And on MacOS X 10.3.9 G4:

('Darwin', 'XXXX', '7.9.0', 'Darwin Kernel Version 7.9.0: Wed Mar 30
20:11:17 PST 2005; root:xnu/xnu-517.12.7.obj~1/RELEASE_PPC ', 'Power
Macintosh', 'powerpc')

One Windows XP 32-bit, I get:
 
R

Robert Kern

Jim said:
I need to detect whether the operating system I am running on (not the
Python version) is 64bit or 32bit. One requirement is that I need to
include support for non-Intel/AMD architectures.

The 2 ways I have thought detecting 64bit are:

1. struct.calcsize("P") == 8
2. '64' in os.uname()[4]

I'm not convinced that either one of these is really adequate. Does
anybody have any other ideas on how to do this?

Does sys.maxint give what you need?

I think for most machines this will give you the answer you are
looking for - either 2**31 -1 for a 32 bit version or 2**63-1 for a 64
bit version. It's set up during the configure phase of building python

No. Some 64-bit systems (notably Win64) leave C longs as 32-bit. This is known
as the LLP64 data model.

--
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
that is made terrible by our own mad attempt to interpret it as though it had
an underlying truth."
-- Umberto Eco
 
L

Lawrence D'Oliveiro

dwelch91 said:
I need to detect whether the operating system I am running on (not the
Python version) is 64bit or 32bit. One requirement is that I need to
include support for non-Intel/AMD architectures.

The standard C way would be to check sizeof(void *).
 
R

Robin Becker

Michael Yanowitz wrote:
.......
The standard C way would be to check sizeof(void *).
so on those old ARM RISC OSes with 32 bit arithmetic would I get sizeof(void *)
== 4 when the address bus was 26 bits wide? Seems a bit naive to assume the
address bus will always be the same width as the registers, but I guess the
compilers have to do something.

I seem to remember some compilers allowing pure 32 bit addressing on 8088
machines (with 16 bit registers), but I think the M$ compilers all had near and
far pointer mechanisms to help you get confused.
-mumbling-ly yrs-
Robin Becker
 
R

Robert Kern

Michael said:
The one thing I observed (just an observation) is that:
a) on 32-bit machines:
sizeof(int) = 32
sizeof(long) = 32
b) on 64-bit machines:
sizeof(int) = 32
sizeof(long) = 64

This in C and Python.

As I've said previously in this thread, not all systems work like that.
Specifically, on Win64 sizeof(long) == 32.

--
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
that is made terrible by our own mad attempt to interpret it as though it had
an underlying truth."
-- Umberto Eco
 
L

Lawrence D'Oliveiro

Robin Becker said:
Michael Yanowitz wrote:
......
so on those old ARM RISC OSes with 32 bit arithmetic would I get sizeof(void
*)
== 4 when the address bus was 26 bits wide?

And the original 68000-based Macs where you would get the same
sizeof(void *), but the address bus was only 24 bits wide. Nevertheless,
you were supposed to pretend that addresses were a full 32 bits in size.
The programs that didn't got into trouble later.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,228
Members
46,818
Latest member
SapanaCarpetStudio

Latest Threads

Top