2011-01-30 34 views
15

Sử dụng Python có cách nào để tìm hiểu thông tin bộ xử lý ... (Tôi cần tên)Nhận thông tin về bộ xử lý trong Python

Tôi cần tên bộ xử lý mà trình thông dịch đang chạy. Tôi đã kiểm tra các mô-đun sys nhưng nó không có chức năng như vậy.

Tôi cũng có thể sử dụng thư viện bên ngoài nếu cần.

Trả lời

21

Chức năng platform.processor() trả về tên bộ xử lý dưới dạng chuỗi.

>>> import platform 
>>> platform.processor() 
'Intel64 Family 6 Model 23 Stepping 6, GenuineIntel' 
+2

bất kỳ ai cũng có thể nói đây là đầu ra độc lập nền tảng hay không. I E. nó luôn luôn cung cấp cho cùng một đầu ra tương tự cho cùng một CPU trên windows/linux/osx? –

+2

Nó trả về một chuỗi rỗng trên hệ thống của tôi (python 2.6.5 trong Ubuntu) ... – Spacedman

+0

@gnibbler: Có bất kỳ lý do gì để nghi ngờ rằng đầu ra có thể thay đổi không? Mặc dù tôi hy vọng ai đó có thể xác nhận. – user225312

6

Có một số mã ở đây:

http://www.koders.com/python/fidB436B8043AA994C550C0961247DACC3E04E84734.aspx?s=mdef%3Apython

rất OS phụ thuộc vào nó, vì vậy có rất nhiều nếu nhánh. Nhưng nó làm việc ra tất cả các khả năng của CPU.

$ python cpuinfo.py 
CPU information: getNCPUs=2 has_mmx has_sse has_sse2 is_64bit is_Intel is_Pentium is_PentiumIV 

Đối với Linux, tìm kiếm/proc/cpuinfo và cố gắng sử dụng chưa được đặt tên. Đối với Windows có vẻ như nó sử dụng registry.

Để có được [đầu tiên] Tên bộ vi xử lý sử dụng mô-đun này:

>>> import cpuinfo 
>>> cpuinfo.cpu.info[0]['model name'] 
'Intel(R) Pentium(R) 4 CPU 3.60GHz' 

Nếu có nhiều hơn một bộ xử lý của nó, sau đó các yếu tố của cpuinfo.cpu.info sẽ có tên của họ. Tôi không nghĩ rằng tôi đã từng nhìn thấy một máy tính với hai bộ xử lý khác nhau mặc dù (không phải từ những năm 80 khi bạn có thể nhận được một bộ xử lý Z80 cho CPU 6502 của bạn BBC Micro ...)

+0

Xin lỗi tôi cần tên, tôi nên đề cập đến – user225312

+0

Cách lấy tên được thêm vào. – Spacedman

+5

Liên kết dường như bị hỏng và tìm kiếm cpuinfo trên trang web đó mang lại nhiều kết quả. bạn có thể vui lòng đặt tên dự án/liên kết tới mã số –

5

Đây là một chút hackish mã nên luôn tìm tên của bộ xử lý trên ba nền tảng mà tôi có bất kỳ trải nghiệm hợp lý nào.

import os, platform, subprocess, re 

def get_processor_name(): 
    if platform.system() == "Windows": 
     return platform.processor() 
    elif platform.system() == "Darwin": 
     os.environ['PATH'] = os.environ['PATH'] + os.pathsep + '/usr/sbin' 
     command ="sysctl -n machdep.cpu.brand_string" 
     return subprocess.check_output(command).strip() 
    elif platform.system() == "Linux": 
     command = "cat /proc/cpuinfo" 
     all_info = subprocess.check_output(command, shell=True).strip() 
     for line in all_info.split("\n"): 
      if "model name" in line: 
       return re.sub(".*model name.*:", "", line,1) 
    return "" 
+1

Tại sao nhập os hai lần? – wings

+2

Cảm ơn, @wings - Tôi đã xóa thêm lần nhập. – dbn

4

đang làm việc (cho tôi biết nếu điều này không làm việc cho bạn):

import platform, subprocess 

def get_processor_info(): 
    if platform.system() == "Windows": 
     return platform.processor() 
    elif platform.system() == "Darwin": 
     return subprocess.check_output(['/usr/sbin/sysctl', "-n", "machdep.cpu.brand_string"]).strip() 
    elif platform.system() == "Linux": 
     command = "cat /proc/cpuinfo" 
     return subprocess.check_output(command, shell=True).strip() 
    return "" 
+0

Trong python3 'subprocess' sẽ không trả về' str' nhưng là 'byte'. Bạn phải chuyển nó thành 'str' với' your_byte.decode ('utf-8') '. Ví dụ, đối với Darwin mã sẽ là 'model = subprocess.check_output (["/usr/sbin/sysctl "," -n "," machdep.cpu.brand_string "]). Strip(); return model.decode ('utf-8') '. – lenooh

1

Các if-ca cho Windows tức là platform.processor() chỉ cung cấp cho các mô tả hoặc gia đình tên bộ xử lý ví dụ Intel64 Family 6 Model 60 Stepping 3.

tôi đã sử dụng:

if platform.system() == "Windows": 
     family = platform.processor() 
     name = subprocess.check_output(["wmic","cpu","get", "name"]).strip().split("\n")[1] 
     return ' '.join([name, family]) 

để có được những mô hình cpu thực tế đó là đầu ra tương tự như if-khối cho Darwin và Linux, ví dụ Intel (R) Core (TM) i7-4790K CPU @ 4.00GHz Intel64 Family 6 Model 60 Stepping 3, GenuineIntel

1

Hình như kịch bản còn thiếu trong câu trả lời @Spacedman là ở đây:

https://github.com/pydata/numexpr/blob/master/numexpr/cpuinfo.py

Nó được vá để làm việc với Python 3.

>python cpuinfo.py 
CPU information: CPUInfoBase__get_nbits=32 getNCPUs=2 has_mmx is_32bit is_Intel is_i686 

Cấu trúc của dữ liệu thực sự là hệ điều hành phụ thuộc, trên Windows nó trông như thế này:

>python -c "import cpuinfo, pprint; pprint.pprint(cpuinfo.cpu.info[0])" 
{'Component Information': '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00', 
'Configuration Data': '\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00', 
'Family': 6, 
'FeatureSet': 2687451135L, 
'Identifier': u'x86 Family 6 Model 23 Stepping 10', 
'Model': 23, 
'Platform ID': 128, 
'Previous Update Signature': '\x00\x00\x00\x00\x0c\n\x00\x00', 
'Processor': '0', 
'ProcessorNameString': u'Intel(R) Core(TM)2 Duo CPU  P8600 @ 2.40GHz', 
'Stepping': 10, 
'Update Signature': '\x00\x00\x00\x00\x0c\n\x00\x00', 
'Update Status': 2, 
'VendorIdentifier': u'GenuineIntel', 
'~MHz': 2394} 

Trên Linux nó là khác nhau:

# python -c "import cpuinfo, pprint; pprint.pprint(cpuinfo.cpu.info[0])" 
{'address sizes': '36 bits physical, 48 bits virtual', 
'apicid': '0', 
'bogomips': '6424.11', 
'bugs': '', 
'cache size': '2048 KB', 
'cache_alignment': '128', 
'clflush size': '64', 
'core id': '0', 
'cpu MHz': '2800.000', 
'cpu cores': '2', 
'cpu family': '15', 
'cpuid level': '6', 
'flags': 'fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm const 
ant_tsc pebs bts nopl pni dtes64 monitor ds_cpl est cid cx16 xtpr pdcm lahf_lm', 
'fpu': 'yes', 
'fpu_exception': 'yes', 
'initial apicid': '0', 
'microcode': '0xb', 
'model': '6', 
'model name': 'Intel(R) Pentium(R) D CPU 3.20GHz', 
'physical id': '0', 
'power management': '', 
'processor': '0', 
'siblings': '2', 
'stepping': '5', 
'uname_m': 'x86_64', 
'vendor_id': 'GenuineIntel', 
'wp': 'yes'} 
0

tôi đã cố gắng ra các giải pháp khác nhau ở đây . cat /proc/cpuinf cho một lượng lớn đầu ra cho một máy đa lõi, nhiều trang dài, platform.processor() dường như cung cấp cho bạn rất ít. Sử dụng Linux và Python 3, sau đây trả về một bản tóm tắt hữu ích về khoảng hai mươi dòng:

import subprocess 
print((subprocess.check_output("lscpu", shell=True).strip()).decode()) 
Các vấn đề liên quan