Обнаружение 64-битной ОС (Windows) в Python - PullRequest
35 голосов
/ 05 февраля 2010

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

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

Ответы [ 19 ]

43 голосов
/ 25 сентября 2012

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

Лучший ответ на вопрос для 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)
39 голосов
/ 05 февраля 2010

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

29 голосов
/ 30 апреля 2011

Пришел сюда в поисках правильного определения, работает ли на 64-битных окнах, собрав все вышеперечисленное в нечто более сжатое.

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

20 голосов
/ 05 февраля 2010

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

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

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

('32bit', 'WindowsPE')

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

8 голосов
/ 31 августа 2011
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

6 голосов
/ 18 сентября 2010

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

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

3 голосов
/ 05 февраля 2010

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

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

2 голосов
/ 20 апреля 2017

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

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

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
  • 32-разрядная версия Windows 7 Pro + Python 2.7.5 (32-разрядная версия)
  • Windows 10 Home 64-bit + Python 2.7.13 (32-bit)
1 голос
/ 05 марта 2010

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

...