web-dev-qa-db-ja.com

Pythonで64ビットOS(Windows)を検出する

WindowsがPythonで動作しているビットバージョンを検出する方法を知っている人はいますか? Program Filesの正しいフォルダを使用する方法として、これを知る必要があります。

どうもありがとう

37
williamtroup

platform module -基盤となるプラットフォームの識別データへのアクセス

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

64ビットWindowsでは、32ビットPythonは次を返します:

('32bit', 'WindowsPE')

これは、この回答が受け入れられたとしても正しくないことを意味します。さまざまな状況で機能するオプションについては、以下の回答のいくつかを参照してください。

25
Joe Koberg

この問題の最良の解決策はMark Ribauによって投稿されたと思います。

Python 2.7以降の質問に対する最良の答えは次のとおりです。

_def is_os_64bit():
    return platform.machine().endswith('64')
_

Windowsでは、クロスプラットフォーム関数platform.machine()は、Matthew Scoutensの回答で使用されている環境変数を内部的に使用します。

次の値が見つかりました:

  • 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)
_
47
phobie

os.environ['PROGRAMFILES']はプログラムファイルフォルダ用です。

40
Jochen Ritzel

64ビットウィンドウで実行されているかどうかを適切に検出するためにここに来て、上記すべてをより簡潔なものにコンパイルします。

以下に、64ビットウィンドウで実行されているかどうかをテストする関数、32ビットプログラムファイルフォルダーを取得する関数、および64ビットプログラムファイルフォルダーを取得する関数を示します。 32ビットまたは64ビットのpythonの実行に関係なくすべて。 32ビットpythonを実行している場合、ほとんどの場合、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

:はい、これは少しハックです。 「正常に動作するはずの」他のすべてのメソッドは、64ビットWindowsで32ビットPython(少なくとも、私が試したさまざまな2.xおよび3.xバージョンに対して)を実行している場合は機能しません)。

編集:
2011-09-07-なぜこのハッキーな方法だけが正しく機能するのかについてのメモを追加しました。

29
Mark Ribau
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

8
Matthew Scouten

Platform.architecture()など、これらの提案されたソリューションの多くは、32ビットと64ビットのどちらのPythonを実行しているかによって結果が異なるため、失敗します。

私が見つけた唯一の信頼できる方法は、残念ながらハックであるos.environ ['PROGRAMFILES(X86)']の存在を確認することです。

6
gauss256

これにアクセスするには、環境変数を使用する必要があります。プログラムファイルのディレクトリは、x86 Windowsでは環境変数PROGRAMFILESに格納され、32ビットのプログラムファイルはPROGRAMFILES(X86)環境変数に格納されます。これらにはos.environ('PROGRAMFILES')

sys.getwindowsversion()またはPROGRAMFILES(X86)if 'PROGRAMFILES(X86)' in os.environ)の存在を使用して、使用しているWindowsのバージョンを確認します。

3
Mike Graham

このドキュメント に続いて、次のコードを試してください:

is_64bits = sys.maxsize > 2**32
2
Waynn Lue

質問のコメントで、この方法はすでに使用されていることを知っています。これは 。netフレームワークが使用するメソッドです

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

私はこれを行う別の方法を見つけただけで、状況によっては役立つ場合があります。

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シエラ+ Python 2.7.11
  • Windows 7 Pro 32ビット+ Python 2.7.5(32ビット)
  • Windows 10 Home 64ビット+ Python 2.7.13(32ビット)
2
Jake W

この古いスレッドを更新するだけです-プラットフォームモジュールが正しいアーキテクチャを報告しているようです(少なくとも、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

(申し訳ありませんが、まだ間違っていると主張している最初の回答についてコメントする担当者がいません:)

1
Hagrid67

件名は64または32ビットOSの検出について尋ねますが、本文はProgramFilesの場所の決定について話します。後者には、ここでいくつかの有効な答えがあります。 StartMenu、デスクトップなどProgramFilesを処理するために一般化された別のソリューションを追加したいと思います。 スタートメニューのプログラムディレクトリのパスを取得する方法?

1
matt wilkie

Windowsシステムについて調べる必要がある場合、通常はレジストリのどこかにあります。MSのドキュメントによると、( http://support.Microsoft.com/kb/556009 )を参照する必要がありますこのキー値:

HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0

そしてそれが:

0x00000020(10進数で32)

32ビットマシンです。

import platform

platform.architecture()[0]

システムアーキテクチャに応じて、「32ビット」または「64ビット」を返します。

1
shahidullah
import struct

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

これは、私が使用する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)
0
BooneStars
 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を印刷します

このコードがこの問題を完全に解決するのに役立つことを願っています

0
rishabhr0y

64ビットバージョンのWindowsは、レジストリリダイレクトおよびリフレクションキーと呼ばれるものを使用します。 32ビットアプリケーションの互換性を可能にするWoW64と呼ばれる互換性レイヤーがあります。 Windows 7およびWindows Server 2008 R2以降、WoW64レジストリキーは反映されなくなり、共有されました。あなたはそれについてここで読むことができます:

レジストリの反映:msdn.Microsoft.com/en-us/library/aa384235(v=vs.85).aspx

影響を受けるキー:msdn.Microsoft.com/en-us/library/aa384253(v=vs.85).aspx

ウィキペディア:en.wikipedia.org/wiki/WoW64

あなたがする必要があるのはそれらのキーの存在を検出することだけです。そのために_winregを使用できます。 try:を使用して、キーを開いてみてください。例:

try:
aReg = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,"SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Run")
0
idenoq

AlexanderBrüschが投稿した解決策は正しい解決策ですが、python3.xでのみ明らかになるバグがあります。彼は、戻り値を GetCurrentProcess() からHANDLEタイプにキャストすることを怠っていました。 IsWow64Process() の最初のパラメーターとして単純な整数を渡すと、0(win32apiからのエラーフラグ)が返されます。また、Alexanderはreturnステートメントを誤って処理します(成功には.value属性がありません)。

このスレッドでつまずく人のために、ここに修正されたコードがあります:

import ctypes

def is64_bit_os():
    """Returns True if running 32-bit code on 64-bit operating system"""
    is64bit = ctypes.c_bool()
    handle = ctypes.wintypes.HANDLE(ctypes.windll.kernel32.GetCurrentProcess())
    success = ctypes.windll.kernel32.IsWow64Process(handle, ctypes.byref(is64bit))
    return success and is64bit.value
print(is64_bit_os())
0
user590028