Windows x64 против x86: оборудование против ОС против процесса - PullRequest
1 голос
/ 05 марта 2020

У меня проблемы с поломкой на основе x86 против x64 в Python 3 на Windows.

Мне нужно знать, запущена ли моя программа Python:

  • В x64 и x86 Аппаратное обеспечение
  • В x64 и x86 Операционная система
  • В x64 и x86 Процесс

Они не являются тоже самое (вообще!).

Процессоры архитектуры AMD64 могут работать с 64- или 32-битными операционными системами .

И 64-битные операционные системы могут работать с 64- или 32-битными процессами .

Я знаю, что:

  • Python * platform.architecture() возвращает строку - но какой из этих 3 он представляет? (Документация, кажется, не говорит.)
  • Если (sys.maxsize > 2**32), то я в 64-битном процессе. Fine; но если я нахожусь в 32-битном процессе, как я могу сказать, нахожусь ли я на 64 или 32-битной ОС?

Чтобы предупредить неизбежное "почему вас это волнует?" вопросы, это потому, что моя Python программа автоматизирует настройку Windows - на x86 все обстоит иначе, чем на x64 Windows, но я заранее не знаю, будет ли моя программа работать на 32 или 64 битах Python.

Так что мне нужно это выяснить.

Ответы [ 2 ]

1 голос
/ 05 марта 2020

То есть, вы задаетесь вопросом, является ли Windows, на котором вы работаете, x64? :)

Раздражение это и это , как насчет

import os
arch = (
    os.environ.get("PROCESSOR_ARCHITEW6432") or 
    os.environ.get("PROCESSOR_ARCHITECTURE")
)
# `arch` should now reliably be `x64` if the system is 64-bit.

0 голосов
/ 05 марта 2020

Я считаю, что это будет работать, но я не проверял его на 32-разрядной версии Windows:

import sys, os
x64_process = (sys.maxsize > 2**32)
x64_os = os.environ.get('ProgramW6432') is not None

И, вероятно, мой самый важный вариант использования - перезапуск explorer.exe после регистрации изменения:

def restartExplorer():
    '''Restart explorer'''
    do(r'taskkill /f /im explorer.exe')
    if x64_os and not x64_process:
        do(os.environ['systemroot']+ r'\sysnative\cmd.exe /c start /B explorer.exe') # because this Python is in a 32 bit process
    else:
        do("start explorer.exe")

Я не дам вам реализацию do(), потому что это довольно очевидно. (Но будет, если кто-то спросит.)

...