我想知道給定的可執行文件(或庫)是否爲Python編譯爲32位或64位。我正在運行Vista 64位,並且想要確定目錄中的某個應用程序是否編譯爲32位或64位。確定可執行文件(或庫)是32位還是64位(在Windows上)
是否有一種簡單的方法可以僅使用標準Python庫(目前使用2.5.4)?
我想知道給定的可執行文件(或庫)是否爲Python編譯爲32位或64位。我正在運行Vista 64位,並且想要確定目錄中的某個應用程序是否編譯爲32位或64位。確定可執行文件(或庫)是32位還是64位(在Windows上)
是否有一種簡單的方法可以僅使用標準Python庫(目前使用2.5.4)?
這個Windows API是GetBinaryType
。您可以使用pywin32從Python中調用這個:
import win32file
type=GetBinaryType("myfile.exe")
if type==win32file.SCS_32BIT_BINARY:
print "32 bit"
# And so on
如果你想做到這一點沒有pywin32,你必須自己閱讀PE header。下面是an example在C#中,這裏有一個快速的端口到Python:
import struct
IMAGE_FILE_MACHINE_I386=332
IMAGE_FILE_MACHINE_IA64=512
IMAGE_FILE_MACHINE_AMD64=34404
f=open("c:\windows\explorer.exe", "rb")
s=f.read(2)
if s!="MZ":
print "Not an EXE file"
else:
f.seek(60)
s=f.read(4)
header_offset=struct.unpack("<L", s)[0]
f.seek(header_offset+4)
s=f.read(2)
machine=struct.unpack("<H", s)[0]
if machine==IMAGE_FILE_MACHINE_I386:
print "IA-32 (32-bit x86)"
elif machine==IMAGE_FILE_MACHINE_IA64:
print "IA-64 (Itanium)"
elif machine==IMAGE_FILE_MACHINE_AMD64:
print "AMD64 (64-bit x86)"
else:
print "Unknown architecture"
f.close()
如果你在Windows上運行的Python 2.5或更高版本,您還可以通過使用ctypes的使用Windows API不pywin32。
from ctypes import windll, POINTER
from ctypes.wintypes import LPWSTR, DWORD, BOOL
SCS_32BIT_BINARY = 0 # A 32-bit Windows-based application
SCS_64BIT_BINARY = 6 # A 64-bit Windows-based application
SCS_DOS_BINARY = 1 # An MS-DOS-based application
SCS_OS216_BINARY = 5 # A 16-bit OS/2-based application
SCS_PIF_BINARY = 3 # A PIF file that executes an MS-DOS-based application
SCS_POSIX_BINARY = 4 # A POSIX-based application
SCS_WOW_BINARY = 2 # A 16-bit Windows-based application
_GetBinaryType = windll.kernel32.GetBinaryTypeW
_GetBinaryType.argtypes = (LPWSTR, POINTER(DWORD))
_GetBinaryType.restype = BOOL
def GetBinaryType(filepath):
res = DWORD()
handle_nonzero_success(_GetBinaryType(filepath, res))
return res
然後像使用win32file.GetBinaryType一樣使用GetBinaryType。
注意,你必須實現handle_nonzero_success,基本上拋出一個異常,如果返回值是0。
我能夠在Python 3.5程序成功地使用馬丁B的回答作出這個調整後:
s=f.read(2).decode(encoding="utf-8", errors="strict")
最初它在Python 2.7的程序中工作得很好,但是在做了其他必要的修改之後,我發現我得到了b'MZ,解碼它似乎解決了這個問題。
這將是很好,如果我可以不使用pywin32模塊獲得這些信息。 – pkit 2009-08-28 08:37:59
剛剛編輯了答案,以顯示如何在沒有pywin32的情況下執行此操作。 – 2009-08-28 08:47:21
@馬丁。感謝您的鏈接,我會看看我是否可以把一些東西放在一起。 – pkit 2009-08-28 08:49:42