Кто-нибудь знает, как я пойду на обнаружение, какая бит версия Windows находится под Python. Мне нужно знать это как способ использования правой папки для файлов программы.
Большое спасибо
Кто-нибудь знает, как я пойду на обнаружение, какая бит версия Windows находится под Python. Мне нужно знать это как способ использования правой папки для файлов программы.
Большое спасибо
platform
module - Доступ к базовым платформам, идентифицирующим данные
>>> import platform
>>> platform.architecture()
('32bit', 'WindowsPE')
В 64-битной Windows возвращается 32-разрядный Python:
('32bit', 'WindowsPE')
И это означает, что этот ответ, даже если он был принят, неверен. Пожалуйста, ознакомьтесь с некоторыми из приведенных ниже ответов для вариантов, которые могут работать для разных ситуаций.
Я думаю, вы должны посмотреть в os.environ['PROGRAMFILES']
для папки программных файлов.
Я думаю, что лучшее решение проблемы было опубликовано Марком Рибау.
Лучший ответ на вопрос для Python 2.7 и новее:
def is_os_64bit():
return platform.machine().endswith('64')
В окнах кросс-платформенная функция platform.machine()
внутренне использует переменные среды, используемые в ответе Мэтью Скаутенса.
Я нашел следующие значения:
Для Python 2.6 и старше:
def is_windows_64bit():
if 'PROCESSOR_ARCHITEW6432' in os.environ:
return True
return os.environ['PROCESSOR_ARCHITECTURE'].endswith('64')
Чтобы найти версию бита интерпретатора Python, я использую:
def is_python_64bit():
return (struct.calcsize("P") == 8)
Пришел сюда для поиска правильного обнаружения, если он работает на 64-битных окнах, скомпилировав все вышеперечисленное в нечто более сжатое.
Ниже вы найдете функцию для проверки работы на 64-битных окнах, функции для получения 32-битной папки программных файлов и функции для получения 64-битной папки Program Files; все независимо от запуска 32-битного или 64-битного питона. При запуске 32-битного python большинство вещей сообщают, что 32bit при работе на 64-битной, даже os.environ['PROGRAMFILES']
.
import os
def Is64Windows():
return 'PROGRAMFILES(X86)' in os.environ
def GetProgramFiles32():
if Is64Windows():
return os.environ['PROGRAMFILES(X86)']
else:
return os.environ['PROGRAMFILES']
def GetProgramFiles64():
if Is64Windows():
return os.environ['PROGRAMW6432']
else:
return None
Примечание: Да, это немного хаки. Все другие методы, которые "должны просто работать", не работают при запуске 32-битного Python на 64-битной Windows (по крайней мере, для различных версий 2.x и 3.x, которые я пробовал).
редактирует:
2011-09-07 - Добавлена заметка о том, почему только этот хакерский метод работает правильно.
def os_platform():
true_platform = os.environ['PROCESSOR_ARCHITECTURE']
try:
true_platform = os.environ["PROCESSOR_ARCHITEW6432"]
except KeyError:
pass
#true_platform not assigned to if this does not exist
return true_platform
http://blogs.msdn.com/b/david.wang/archive/2006/03/26/howto-detect-process-bitness.aspx
Многие из предлагаемых решений, таких как platform.architecture(), терпят неудачу, потому что их результаты зависят от того, используете ли вы 32-разрядный или 64-разрядный Python.
Единственный надежный метод, который я нашел, - проверить наличие os.environ ['PROGRAMFILES (X86)'], что, к сожалению, хакерское.
Вы должны использовать переменные среды для доступа к этому. Каталог программных файлов хранится в переменной окружения PROGRAMFILES
на x86 Windows, 32-разрядные программные файлы - это каталог, который хранится в переменной среды PROGRAMFILES(X86)
, к ним можно получить доступ с помощью os.environ('PROGRAMFILES')
.
Используйте sys.getwindowsversion()
или существование PROGRAMFILES(X86)
(if 'PROGRAMFILES(X86)' in os.environ
), чтобы определить, какую версию Windows вы используете.
Строки темы запрашивают об обнаружении 64 или 32-битной ОС, в то время как тело говорит об определении местоположения программных файлов. У последнего есть несколько реальных ответов здесь. Я хотел бы добавить другое решение, обобщенное для обработки StartMenu, Desktop и т.д., А также ProgramFiles: Как получить путь к каталогу программ меню "Пуск" ?
Следуя этой документации, попробуйте этот код:
is_64bits = sys.maxsize > 2**32
Когда вам нужно узнать о системе Windows, обычно это где-то в реестре, согласно документации MS, вы должны посмотреть (http://support.microsoft.com/kb/556009) это значение ключа:
HKLM\HARDWARE\Описание\System\CentralProcessor\0
и если это:
0x00000020 (32 в десятичной форме)
Это 32-разрядная машина.
Просто обновить этот старый поток - похоже, что модуль платформы теперь сообщает правильную архитектуру (по крайней мере, в Python 2.7.8):
c:\python27\python.exe -c "import platform; print platform.architecture(), platform.python_version()"
('32bit', 'WindowsPE') 2.7.6
c:\home\python278-x64\python.exe -c "import platform; print platform.architecture(), platform.python_version()"
('64bit', 'WindowsPE') 2.7.8
(извините, у меня нет ответа, чтобы прокомментировать первый ответ, который по-прежнему утверждает, что он ошибается:)
Я просто нашел другой способ сделать это, что может быть полезно в некоторых ситуациях.
import subprocess
import os
def os_arch():
os_arch = '32-bit'
if os.name == 'nt':
output = subprocess.check_output(['wmic', 'os', 'get', 'OSArchitecture'])
os_arch = output.split()[1]
else:
output = subprocess.check_output(['uname', '-m'])
if 'x86_64' in output:
os_arch = '64-bit'
else:
os_arch = '32-bit'
return os_arch
print 'os_arch=%s' % os_arch()
Я тестировал этот код в следующих средах:
64-разрядные версии Windows используют что-то, называемое ключами перенаправления и отражения реестра. Существует уровень совместимости WoW64, который обеспечивает совместимость 32-разрядных приложений. Начиная с Windows 7 и Windows Server 2008 R2 ключи реестра WoW64 больше не отражены, а разделены. Вы можете прочитать об этом здесь:
реестр-отражение: msdn.microsoft.com/en-us/library/aa384235 (v = vs .85).aspx
affected-keys: msdn.microsoft.com/en-us/library/aa384253 (v = vs .85).aspx
wikipedia: ru.wikipedia.org/wiki/WoW64
Все, что вам нужно сделать, это обнаружить наличие этих ключей. Вы можете использовать _winreg для этого. Используйте try: и попробуйте открыть ключ, например:
try:
aReg = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,"SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Run")
import _winreg
def get_registry_value(key, subkey, value):
key = getattr(_winreg, key)
handle = _winreg.OpenKey(key, subkey )
(value, type) = _winreg.QueryValueEx(handle, value)
return value
windowsbit=cputype = get_registry_value(
"HKEY_LOCAL_MACHINE",
"SYSTEM\\CurrentControlSet\Control\\Session Manager\\Environment",
"PROCESSOR_ARCHITECTURE")
print windowsbit
просто запустите этот код
если вы работаете на 64-битной машине Windows, это будет печатать AMD64
или если вы работаете над 32-битным, он будет печатать AMD32
Надеюсь, этот код поможет полностью решить эту проблему.
Это работает для меня в версиях Python, которые я использую: 2.7 и 2.5.4
import win32com.client
import _winreg
shell = win32com.client.Dispatch('WScript.Shell')
proc_arch = shell.ExpandEnvironmentStrings(r'%PROCESSOR_ARCHITECTURE%').lower()
if proc_arch == 'x86':
print "32 bit"
elif proc_arch == 'amd64':
print "64 bit"
else:
raise Exception("Unhandled arch: %s" % proc_arch)
Мне известно, что в комментариях к вопросу этот метод уже использовался. Это метод .NET framework использует:
import ctypes
def is64_bit_os():
""" Returns wethever system is a 64bit operating system"""
is64bit = ctypes.c_bool()
handle = ctypes.windll.kernel32.GetCurrentProcess() # should be -1, because the current process is currently defined as (HANDLE) -1
success = ctypes.windll.kernel32.IsWow64Process(handle, ctypes.byref(is64bit)) #should return 1
return (success and is64bit).value
print(is64_bit_os())
платформа импорта
platform.architecture() [0]
Он вернет "32 бит" или "64 бит" в зависимости от архитектуры системы.
import struct
def is64Windows():
return struct.calcsize('P') * 8 == 64
Должен быть каталог под Windows 64bit, папка под названием \Windows\WinSxS64
для 64 бит, под Windows 32bit, это WinSxS.
Надеюсь, что это поможет.