Чтоб самому не забыть и не потерять, положу-ка это в блог.
В некоторых случаях определения разрядности Python недостаточно для принятия решения без выяснения
разрядности Windows, на которой он работает. 32-битный Python на 64-битной Windows - не редкость.
И вроде бы решения известны, но вот не чувствовал я в себе уверенности, применяя их.
Хотя в VirtualBox всё выглядело хорошо, но возможности проверить на реальном железе не было.
А тут как раз и подвернулась такая возможность. На подходящем железе c Intel Core 2 Duo сначала была
развёрнута Win7(32bit), затем - Win7(64bit). Ну и Python 3.8.6 (32bit/64bit).
Из надёрганного в Интернете по этой теме был слеплен скриптик для сбора данных.
win_check.py:
| Python | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
| import ctypes
print('ctypes.sizeof(ctypes.c_void_p) * 8 =', ctypes.sizeof(ctypes.c_void_p) * 8)
print('')
import os
print('os.name =', os.name)
print('')
import platform
print('platform.architecture() =', platform.architecture())
print('platform.machine() =', platform.machine())
print('platform.processor() =', platform.processor())
print('platform.system() =', platform.system())
print('platform.uname() =', platform.uname())
print('platform.win32_ver() =', platform.win32_ver())
print('platform.win32_edition() =', platform.win32_edition())
print('')
import struct
print('struct.calcsize("P") * 8 =', struct.calcsize('P') * 8)
print('')
import sys
print('hex(sys.maxsize) =', hex(sys.maxsize))
print('(sys.maxsize > 0x100000000) is', sys.maxsize > 0x100000000)
print('sys.platform =', sys.platform)
print('sys.version() =', sys.version)
print('sys.winver =', sys.winver)
print('')
import winreg
key_reg = 'SOFTWARE\\Wow6432Node'
is_exist = False
try:
reg = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE)
k = winreg.OpenKey(reg, key_reg)
k.Close()
is_exist = True
except:
pass
print('HKEY_LOCAL_MACHINE\\{!s} is exist?'.format(key_reg), is_exist) |
|
И пускачи для Win64, поскольку питоны там ставились без ланчера и добавления путей в PATH.
py32.cmd:
| Code | 1
2
3
4
5
6
7
8
| @ECHO OFF
SETLOCAL
SET PATH=C:\Program Files (x86)\Python38-32\Scripts\;C:\Program Files (x86)\Python38-32\;%PATH%
python.exe %*
ENDLOCAL |
|
py64.cmd:
| Code | 1
2
3
4
5
6
7
8
| @ECHO OFF
SETLOCAL
SET PATH=C:\Program Files\Python38\Scripts\;C:\Program Files\Python38\;%PATH%
python.exe %*
ENDLOCAL |
|
И всё это было прогнано сначала на Win32, а затем на Win64.
Windows 7 (32bit), Python 3.8.6 (32bit):
| Code | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| C:\Tools>win_check.py
ctypes.sizeof(ctypes.c_void_p) * 8 = 32
os.name = nt
platform.architecture() = ('32bit', 'WindowsPE')
platform.machine() = x86
platform.processor() = x86 Family 6 Model 15 Stepping 11, GenuineIntel
platform.uname() = uname_result(system='Windows', node='usr-win32', release='7',
version='6.1.7601', machine='x86', processor='x86 Family 6 Model 15 Stepping 11,
GenuineIntel')
platform.win32_ver() = ('7', '6.1.7601', 'SP1', 'Multiprocessor Free')
platform.win32_edition() = Professional
struct.calcsize("P") * 8 = 32
hex(sys.maxsize) = 0x7fffffff
(sys.maxsize > 0x100000000) is False
sys.platform = win32
sys.version() = 3.8.6 (tags/v3.8.6:db45529, Sep 23 2020, 15:37:30) [MSC v.1927
32 bit (Intel)]
sys.winver = 3.8-32
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node is exist? True |
|
Windows 7 (64bit), Python 3.8.6 (32bit):
| Code | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| C:\Tools>py32 win_check.py
ctypes.sizeof(ctypes.c_void_p) * 8 = 32
os.name = nt
platform.architecture() = ('32bit', 'WindowsPE')
platform.machine() = AMD64
platform.processor() = Intel64 Family 6 Model 15 Stepping 11, GenuineIntel
platform.uname() = uname_result(system='Windows', node='usr-win64', release='7',
version='6.1.7601', machine='AMD64', processor='Intel64 Family 6 Model 15 Stepping 11,
GenuineIntel')
platform.win32_ver() = ('7', '6.1.7601', 'SP1', 'Multiprocessor Free')
platform.win32_edition() = Professional
struct.calcsize("P") * 8 = 32
hex(sys.maxsize) = 0x7fffffff
(sys.maxsize > 0x100000000) is False
sys.platform = win32
sys.version() = 3.8.6 (tags/v3.8.6:db45529, Sep 23 2020, 15:37:30) [MSC v.1927
32 bit (Intel)]
sys.winver = 3.8-32
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node is exist? True |
|
Windows 7 (64bit), Python 3.8.6 (64bit):
| Code | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| C:\Tools>py64 win_check.py
ctypes.sizeof(ctypes.c_void_p) * 8 = 64
os.name = nt
platform.architecture() = ('64bit', 'WindowsPE')
platform.machine() = AMD64
platform.processor() = Intel64 Family 6 Model 15 Stepping 11, GenuineIntel
platform.uname() = uname_result(system='Windows', node='usr-win64', release='7',
version='6.1.7601', machine='AMD64', processor='Intel64 Family 6 Model 15 Stepping 11,
GenuineIntel')
platform.win32_ver() = ('7', '6.1.7601', 'SP1', 'Multiprocessor Free')
platform.win32_edition() = Professional
struct.calcsize("P") * 8 = 64
hex(sys.maxsize) = 0x7fffffffffffffff
(sys.maxsize > 0x100000000) is True
sys.platform = win32
sys.version() = 3.8.6 (tags/v3.8.6:db45529, Sep 23 2020, 15:52:53) [MSC v.1927
64 bit (AMD64)]
sys.winver = 3.8
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node is exist? True |
|
Ну и, по итогам, для уверенного опредения размерностей Python и Windows вроде бы
напрашивается соблюдение таких необходимых и достаточных условий:
| Python | 1
2
3
4
5
6
7
8
| if sys.platform == 'win32' and platform.machine() == 'x86':
print('Windows (32bit) and Python (32bit)')
elif sys.platform == 'win32' and sys.maxsize > 0x100000000:
print('Windows (64bit) and Python (64bit)')
elif sys.platform == 'win32':
print('Windows (64bit) and Python (32bit)')
else:
print('This is NOT Windows!!!') |
|
Windows 8 и 10 под рукой не было, поэтому Python 3.9.x не проверить.
|