Подтвердить что ты не робот

Обнаружение 64-битной ОС (windows) в Python

Кто-нибудь знает, как я пойду на обнаружение, какая бит версия Windows находится под Python. Мне нужно знать это как способ использования правой папки для файлов программы.

Большое спасибо

4b9b3361

Ответ 1

platform module - Доступ к базовым платформам, идентифицирующим данные

>>> import platform
>>> platform.architecture()
('32bit', 'WindowsPE')

В 64-битной Windows возвращается 32-разрядный Python:

('32bit', 'WindowsPE')

И это означает, что этот ответ, даже если он был принят, неверен. Пожалуйста, ознакомьтесь с некоторыми из приведенных ниже ответов для вариантов, которые могут работать для разных ситуаций.

Ответ 2

Я думаю, вы должны посмотреть в os.environ['PROGRAMFILES'] для папки программных файлов.

Ответ 3

Я думаю, что лучшее решение проблемы было опубликовано Марком Рибау.

Лучший ответ на вопрос для Python 2.7 и новее:

def is_os_64bit():
    return platform.machine().endswith('64')

В окнах кросс-платформенная функция platform.machine() внутренне использует переменные среды, используемые в ответе Мэтью Скаутенса.

Я нашел следующие значения:

  • WinXP-32: x86
  • Vista-32: x86
  • Win7-64: AMD64
  • Debian-32: i686
  • Debian-64: x86_64

Для 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)

Ответ 4

Пришел сюда для поиска правильного обнаружения, если он работает на 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 - Добавлена ​​заметка о том, почему только этот хакерский метод работает правильно.

Ответ 6

Многие из предлагаемых решений, таких как platform.architecture(), терпят неудачу, потому что их результаты зависят от того, используете ли вы 32-разрядный или 64-разрядный Python.

Единственный надежный метод, который я нашел, - проверить наличие os.environ ['PROGRAMFILES (X86)'], что, к сожалению, хакерское.

Ответ 7

Вы должны использовать переменные среды для доступа к этому. Каталог программных файлов хранится в переменной окружения PROGRAMFILES на x86 Windows, 32-разрядные программные файлы - это каталог, который хранится в переменной среды PROGRAMFILES(X86), к ним можно получить доступ с помощью os.environ('PROGRAMFILES').

Используйте sys.getwindowsversion() или существование PROGRAMFILES(X86) (if 'PROGRAMFILES(X86)' in os.environ), чтобы определить, какую версию Windows вы используете.

Ответ 8

Строки темы запрашивают об обнаружении 64 или 32-битной ОС, в то время как тело говорит об определении местоположения программных файлов. У последнего есть несколько реальных ответов здесь. Я хотел бы добавить другое решение, обобщенное для обработки StartMenu, Desktop и т.д., А также ProgramFiles: Как получить путь к каталогу программ меню "Пуск" ?

Ответ 10

Когда вам нужно узнать о системе Windows, обычно это где-то в реестре, согласно документации MS, вы должны посмотреть (http://support.microsoft.com/kb/556009) это значение ключа:

HKLM\HARDWARE\Описание\System\CentralProcessor\0

и если это:

0x00000020 (32 в десятичной форме)

Это 32-разрядная машина.

Ответ 11

Просто обновить этот старый поток - похоже, что модуль платформы теперь сообщает правильную архитектуру (по крайней мере, в 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

(извините, у меня нет ответа, чтобы прокомментировать первый ответ, который по-прежнему утверждает, что он ошибается:)

Ответ 12

Я просто нашел другой способ сделать это, что может быть полезно в некоторых ситуациях.

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()

Я тестировал этот код в следующих средах:

  • Ubuntu 16.04 + Python 2.7.12
  • Mac OS Sierra + Python 2.7.11
  • Windows 7 Pro 32-разрядный + Python 2.7.5 (32-разрядный)
  • Windows 10 Home 64-bit + Python 2.7.13 (32-разрядная версия)

Ответ 13

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")

Ответ 14

 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

Надеюсь, этот код поможет полностью решить эту проблему.

Ответ 15

Это работает для меня в версиях 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)

Ответ 16

Мне известно, что в комментариях к вопросу этот метод уже использовался. Это метод .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())

Ответ 17

платформа импорта

platform.architecture() [0]

Он вернет "32 бит" или "64 бит" в зависимости от архитектуры системы.

Ответ 18

import struct

def is64Windows():
    return struct.calcsize('P') * 8 == 64

Ответ 19

Должен быть каталог под Windows 64bit, папка под названием \Windows\WinSxS64 для 64 бит, под Windows 32bit, это WinSxS.

Надеюсь, что это поможет.