На самом деле, вы должны использовать управляемые объекты JVM или Spring-managed Object для вызова методов. из вашего вышеуказанного кода в классе контроллера вы создаете новый объект для вызова своего класса обслуживания, у которого есть объект с автоматической проводкой.
MileageFeeCalculator calc = new MileageFeeCalculator();
, поэтому он не будет работать таким образом.
Решение делает этот MileageFeeCalculator как объект с автоматической проводкой в самом контроллере.
Измените свой класс контроллера, как показано ниже.
@Controller
public class MileageFeeController {
@Autowired
MileageFeeCalculator calc;
@RequestMapping("/mileage/{miles}")
@ResponseBody
public float mileageFee(@PathVariable int miles) {
return calc.mileageCharge(miles);
}
}
Похоже, что отсутствующий скрипт в ответе @Spacedman находится здесь:
https://github.com/pydata/numexpr/blob/master/numexpr/cpuinfo.py
Он исправлен для работы с Python 3.
>python cpuinfo.py
CPU information: CPUInfoBase__get_nbits=32 getNCPUs=2 has_mmx is_32bit is_Intel is_i686
Структура данных действительно зависит от ОС, в Windows это выглядит так:
>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}
В Linux это другое:
# 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'}
Я попробовал различные решения здесь. cat /proc/cpuinf
дает огромное количество результатов для многоядерной машины, много страниц длиннее platform.processor()
, кажется, дает вам очень мало. Используя Linux и Python 3, следующее возвращает полезное резюме около двадцати строк:
import subprocess
print((subprocess.check_output("lscpu", shell=True).strip()).decode())
Вот хакерский бит кода, который должен последовательно находить имя процессора на трех платформах, у которых есть разумный опыт.
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 ""
Для Linux и обратной совместимости с Python (не у всех есть cpuinfo
), вы можете проанализировать через /proc/cpuinfo
напрямую. Чтобы получить скорость процессора, попробуйте:
# Take any float trailing "MHz", some whitespace, and a colon.
speeds = re.search("MHz\s*: (\d+\.?\d*)", cpuinfo_content)
Обратите внимание на необходимое использование \s
для пробелов ... /proc/cpuinfo
на самом деле имеет символы табуляции, и я работал в течение нескольких часов с sed
до тех пор, пока я придумал:
sed -rn 's/cpu MHz[ \t]*: ([0-9]+\.?[0-9]*)/\1/gp' /proc/cpuinfo
Мне не хватало \t
, и это сбило меня с ума, потому что я либо сопоставил весь файл, либо ничего.
Попробуйте аналогичные регулярные выражения для других полей вам нужно:
# Take any string after the specified field name and colon.
re.search("field name\s*: (.+)", cpuinfo_content)
В случае if-case для платформы Windows i.e platform.processor () просто указывается описание или фамилия процессора, например. Intel64 Family 6 Model 60 Stepping 3.
Я использовал:
if platform.system() == "Windows":
family = platform.processor()
name = subprocess.check_output(["wmic","cpu","get", "name"]).strip().split("\n")[1]
return ' '.join([name, family])
, чтобы получить фактическую модель процессора, которая является тем же самым выходом, что и if-blocks для Darwin и Linux, например Intel (R) Core (TM) i7-4790K CPU @ 4.00GHz Intel64 Family 6 Model 60 Stepping 3, GenuineIntel
Рабочий код (дайте мне знать, если это не сработает для вас):
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 ""
subprocess
не будет возвращать str
, но byte
. Вы должны преобразовать его в str
с your_byte.decode('utf-8')
. Например, для Дарвина код будет model = subprocess.check_output(["/usr/sbin/sysctl", "-n", "machdep.cpu.brand_string"]).strip() ; return model.decode('utf-8')
.
– lenooh
9 March 2018 в 18:00
Для удобного использования вы можете использовать cpuinfo
.
Установить как pip install py-cpuinfo
Использовать из командной строки: python -m cpuinfo
Код:
import cpuinfo
cpuinfo.get_cpu_info()['brand']
Функция platform.processor () возвращает имя процессора как строку.
>>> import platform
>>> platform.processor()
'Intel64 Family 6 Model 23 Stepping 6, GenuineIntel'