WindowsがPythonで動作しているビットバージョンを検出する方法を知っている人はいますか? Program Filesの正しいフォルダを使用する方法として、これを知る必要があります。
どうもありがとう
platform
module -基盤となるプラットフォームの識別データへのアクセス
>>> import platform
>>> platform.architecture()
('32bit', 'WindowsPE')
64ビットWindowsでは、32ビットPythonは次を返します:
('32bit', 'WindowsPE')
これは、この回答が受け入れられたとしても正しくないことを意味します。さまざまな状況で機能するオプションについては、以下の回答のいくつかを参照してください。
この問題の最良の解決策はMark Ribauによって投稿されたと思います。
Python 2.7以降の質問に対する最良の答えは次のとおりです。
_def is_os_64bit():
return platform.machine().endswith('64')
_
Windowsでは、クロスプラットフォーム関数platform.machine()
は、Matthew Scoutensの回答で使用されている環境変数を内部的に使用します。
次の値が見つかりました:
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)
_
os.environ['PROGRAMFILES']
はプログラムファイルフォルダ用です。
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-なぜこのハッキーな方法だけが正しく機能するのかについてのメモを追加しました。
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
Platform.architecture()など、これらの提案されたソリューションの多くは、32ビットと64ビットのどちらのPythonを実行しているかによって結果が異なるため、失敗します。
私が見つけた唯一の信頼できる方法は、残念ながらハックであるos.environ ['PROGRAMFILES(X86)']の存在を確認することです。
これにアクセスするには、環境変数を使用する必要があります。プログラムファイルのディレクトリは、x86 Windowsでは環境変数PROGRAMFILES
に格納され、32ビットのプログラムファイルはPROGRAMFILES(X86)
環境変数に格納されます。これらにはos.environ('PROGRAMFILES')
。
sys.getwindowsversion()
またはPROGRAMFILES(X86)
(if 'PROGRAMFILES(X86)' in os.environ
)の存在を使用して、使用しているWindowsのバージョンを確認します。
このドキュメント に続いて、次のコードを試してください:
is_64bits = sys.maxsize > 2**32
質問のコメントで、この方法はすでに使用されていることを知っています。これは 。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())
私はこれを行う別の方法を見つけただけで、状況によっては役立つ場合があります。
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()
このコードを次の環境でテストしました。
この古いスレッドを更新するだけです-プラットフォームモジュールが正しいアーキテクチャを報告しているようです(少なくとも、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
(申し訳ありませんが、まだ間違っていると主張している最初の回答についてコメントする担当者がいません:)
件名は64または32ビットOSの検出について尋ねますが、本文はProgramFilesの場所の決定について話します。後者には、ここでいくつかの有効な答えがあります。 StartMenu、デスクトップなどProgramFilesを処理するために一般化された別のソリューションを追加したいと思います。 スタートメニューのプログラムディレクトリのパスを取得する方法?
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ビット」を返します。
import struct
def is64Windows():
return struct.calcsize('P') * 8 == 64
これは、私が使用する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)
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を印刷します
このコードがこの問題を完全に解決するのに役立つことを願っています
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")
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())