Форум программистов, компьютерный форум, киберфорум
iamvic
Войти
Регистрация
Восстановить пароль
Карта форума Блоги Сообщество Поиск Заказать работу  
Путевые заметки в процессе познания Python и PyQt/PySide.
Помни - только тег CODE не портит код добавлением пробела в начало пустой строки.
Рейтинг: 1.00. Голосов: 1.

К вопросу определения разрядности Python и Windows

Запись от iamvic размещена 09.12.2020 в 14:02
Метки python, python 3, windows

Чтоб самому не забыть и не потерять, положу-ка это в блог.

В некоторых случаях определения разрядности 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:
Код:
@ECHO OFF

SETLOCAL

SET PATH=C:\Program Files (x86)\Python38-32\Scripts\;C:\Program Files (x86)\Python38-32\;%PATH%
python.exe %*

ENDLOCAL
py64.cmd:
Код:
@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):
Код:
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):
Код:
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):
Код:
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 не проверить.
Размещено в Памятка
Показов 9764 Комментарии 2
Всего комментариев 2
Комментарии
  1. Старый комментарий
    Аватар для Welemir1
    3.9 на вин 7 уже не встает и 32 разрядные версии канули с его выходом в лету, так что скоро 64 бит онли!
    Запись от Welemir1 размещена 10.12.2020 в 13:13 Welemir1 вне форума
  2. Старый комментарий
    Цитата:
    Сообщение от Welemir1 Просмотреть комментарий
    3.9 на вин 7 уже не встает и 32 разрядные версии канули с его выходом в лету, так что скоро 64 бит онли!
    А если в будущее смотреть с оптимизмом, то, наверное, не за горами и 128-разрядные процессоры.
    И эта проблема снова встанет в полный рост .
    Запись от iamvic размещена 10.12.2020 в 19:55 iamvic вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru