【问题标题】:Windows x64 vs x86: Hardware vs. OS vs. processWindows x64 与 x86:硬件与操作系统与进程
【发布时间】:2020-03-05 17:44:58
【问题描述】:

我在 Windows 上基于 x86 与 x64 的 Python 3 中遇到问题。

我需要知道我的 Python 程序是否正在运行:

  • 在 x64 与 x86 硬件上
  • 在 x64 与 x86 操作系统上
  • 在 x64 与 x86 进程中

它们不是一回事(根本!)。

AMD64 架构处理器可以运行 64 位或 32 位操作系统

64 位操作系统可以运行 64 位或 32 位进程

我知道:

  • Python 的 platform.architecture() 返回一个字符串 - 但是这 3 个中的哪一个 它代表吗? (文档似乎没有说。)
  • 如果 (sys.maxsize > 2**32) 则我处于 64 位进程中。美好的;但是如果我在 32 位进程中,我如何判断我是在 64 位还是 32 位操作系统上?

为了避免不可避免的“你为什么在乎?”问题,这是因为我的 Python 程序正在自动配置 Windows - x86 和 x64 Windows 上的东西在不同的地方,但我事先不知道我的程序是在 32 位还是 64 位 Python 上运行。

所以我需要弄清楚。

【问题讨论】:

  • 事物在不同的地方不是,或者更确切地说,操作系统隐藏了差异。您不应该尝试直接访问WoW64Program Filex (x86) 文件夹。无论如何,应用程序数据不应该存储在Program Files 中,这就是ProgramData 的用途。
  • 那么,你为什么在乎呢?您正在尝试执行哪种配置自动化,为什么操作系统位数很重要?可能有更合适的方法来做任何你想做的事,不要试图绕过操作系统
  • 顺便说一句,如果您在 x64 处理器上运行 32 位版本的 Windows,您仍然可以在 32 位版本的 Windows 上运行。文件夹不会改变。所以实际的处理器架构应该无关紧要。
  • 既然人们在问 - (1) 我需要知道是安装 x64 还是 x86 版本的应用程序(某些应用程序有不同的安装 .EXE 基于此),并且 (2) 只有当我' m 在 64 位操作系统上的 32 位进程中,我需要运行 cmd.exe 和 nbtstat.exe 的 64 位版本,(3) 如果在 32 位操作系统上我运行“SetACL32”,但在 64 位操作系统上我运行“SetACL”。微软试图隐藏差异的工作大部分时间都能找到——但不是为了这些东西。 (我希望不是这样。)
  • 1) 所有安装程序都已经支持打包多个目标并部署适当的目标。 setup.exe 通常只是一个启动适当安装程序的引导程序。对于 2),您不需要调用单独的版本。除非您明确尝试使用绝对路径运行可执行文件。 3) SetACL 是第三方产品。您不需要它来设置权限。内置命令为cacls

标签: python python-3.x windows 64-bit x86-64


【解决方案1】:

所以您的实际问题是您运行的 Windows 是否是 x64? :)

扯掉thisthis,怎么样

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.

【讨论】:

  • OP 的问题可能是试图直接写入 WoW64 或 Program Files (x86) 文件夹。这是一个非常糟糕的主意,因为操作系统会煞费苦心地隐藏架构差异。如果 Python 代码以 32 位运行,它将看到 Wow64 文件夹,例如
  • 在彻底测试之前赞成。它不起作用。如果您在 64 位 Windows 上的 32 位进程中运行它,PROCESSOR_ARCHITEW6432 是“AMD64”,PROCESSOR_ARCHITECTURE 是“x86”。所以这真的是在测试 64 位进程,而不是操作系统。
  • 可以,但是您不能在 x32 操作系统上运行 x64 进程。
  • 我认为@nerdfever.com 想知道系统是否可以运行 64 位可执行文件,而不是当前 Python 解释器是作为 32 位还是 64 位运行过程。例如便携式安装程序可能以 32 位运行,因此即使系统只有 32 位,它也可以工作并选择要安装的内容。或者可能是其他一些用例。
  • @AKX 但是您可以在 64 位操作系统中运行 32 位进程。
【解决方案2】:

我相信这会起作用,但我还没有在 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() 的实现,因为它很明显。 (但如果有人问的话。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 2012-08-26
    • 2011-05-24
    • 2015-07-24
    • 2022-06-15
    相关资源
    最近更新 更多