pyhw 0.1.0b0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. pyhw/__init__.py +1 -0
  2. pyhw/__main__.py +37 -0
  3. pyhw/backend/__init__.py +3 -0
  4. pyhw/backend/backendBase.py +21 -0
  5. pyhw/backend/cpu/__init__.py +3 -0
  6. pyhw/backend/cpu/cpuBase.py +13 -0
  7. pyhw/backend/cpu/linux.py +56 -0
  8. pyhw/backend/gpu/__init__.py +3 -0
  9. pyhw/backend/gpu/gpuBase.py +12 -0
  10. pyhw/backend/gpu/linux.py +43 -0
  11. pyhw/backend/host/__init__.py +3 -0
  12. pyhw/backend/host/hostBase.py +19 -0
  13. pyhw/backend/host/linux.py +50 -0
  14. pyhw/backend/host/macos.py +5 -0
  15. pyhw/backend/host/windows.py +5 -0
  16. pyhw/backend/kernel/__init__.py +3 -0
  17. pyhw/backend/kernel/kernelBase.py +17 -0
  18. pyhw/backend/kernel/linux.py +47 -0
  19. pyhw/backend/kernel/macos.py +7 -0
  20. pyhw/backend/kernel/windows.py +7 -0
  21. pyhw/backend/memory/__init__.py +3 -0
  22. pyhw/backend/memory/linux.py +32 -0
  23. pyhw/backend/memory/memoryBase.py +12 -0
  24. pyhw/backend/metal/t.py +19 -0
  25. pyhw/backend/os/__init__.py +3 -0
  26. pyhw/backend/os/linux.py +62 -0
  27. pyhw/backend/os/osBase.py +13 -0
  28. pyhw/backend/shell/__init__.py +3 -0
  29. pyhw/backend/shell/shellBase.py +13 -0
  30. pyhw/backend/shell/unix.py +56 -0
  31. pyhw/backend/title/__init__.py +3 -0
  32. pyhw/backend/title/titleBase.py +16 -0
  33. pyhw/backend/title/unix.py +33 -0
  34. pyhw/backend/title/windows.py +8 -0
  35. pyhw/backend/uptime/__init__.py +3 -0
  36. pyhw/backend/uptime/linux.py +36 -0
  37. pyhw/backend/uptime/uptimeBase.py +20 -0
  38. pyhw/frontend/__init__.py +3 -0
  39. pyhw/frontend/color/__init__.py +5 -0
  40. pyhw/frontend/color/colorConfig.py +90 -0
  41. pyhw/frontend/color/colorSet.py +58 -0
  42. pyhw/frontend/color/colorUtil.py +6 -0
  43. pyhw/frontend/frontendBase.py +69 -0
  44. pyhw/frontend/logo/__init__.py +3 -0
  45. pyhw/frontend/logo/ascii/debian.pyhw +17 -0
  46. pyhw/frontend/logo/ascii/fedora.pyhw +19 -0
  47. pyhw/frontend/logo/ascii/linux.pyhw +12 -0
  48. pyhw/frontend/logo/ascii/macOS.pyhw +17 -0
  49. pyhw/frontend/logo/ascii/ubuntu.pyhw +20 -0
  50. pyhw/frontend/logo/logoBase.py +22 -0
  51. pyhw/macos.py +146 -0
  52. pyhw/pyhwException/__init__.py +3 -0
  53. pyhw/pyhwException/pyhwException.py +14 -0
  54. pyhw/pyhwUtil/__init__.py +3 -0
  55. pyhw/pyhwUtil/pyhwUtil.py +50 -0
  56. pyhw-0.1.0b0.dist-info/LICENSE +28 -0
  57. pyhw-0.1.0b0.dist-info/METADATA +42 -0
  58. pyhw-0.1.0b0.dist-info/RECORD +61 -0
  59. pyhw-0.1.0b0.dist-info/WHEEL +5 -0
  60. pyhw-0.1.0b0.dist-info/entry_points.txt +2 -0
  61. pyhw-0.1.0b0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,8 @@
1
+ """
2
+ In dev.
3
+ """
4
+
5
+
6
+ class TitleDetectWindows:
7
+ def getTitle(self):
8
+ pass
@@ -0,0 +1,3 @@
1
+ from .uptimeBase import UptimeDetect
2
+
3
+ __all__ = ['UptimeDetect']
@@ -0,0 +1,36 @@
1
+ """
2
+ In dev.
3
+ """
4
+ from dataclasses import dataclass
5
+
6
+
7
+ @dataclass
8
+ class UptimeInfoLinux:
9
+ uptime = ""
10
+
11
+
12
+ class UptimeDetectLinux:
13
+ def __init__(self):
14
+ self.__uptimeInfo = UptimeInfoLinux()
15
+
16
+ def getUptimeInfo(self):
17
+ self.__getUptime()
18
+ return self.__uptimeInfo
19
+
20
+ def __getUptime(self):
21
+ with open("/proc/uptime", "r") as f:
22
+ uptime_seconds = float(f.readline().split(" ")[0])
23
+ hours, remainder = divmod(uptime_seconds, 3600)
24
+ minutes, seconds = divmod(remainder, 60)
25
+ days, hours = divmod(hours, 24)
26
+ days = int(days)
27
+ hours = int(hours)
28
+ minutes = int(minutes)
29
+ seconds = int(seconds)
30
+ if days == 0:
31
+ if hours == 0:
32
+ self.__uptimeInfo.uptime = f"{minutes} minutes {seconds} seconds"
33
+ else:
34
+ self.__uptimeInfo.uptime = f"{hours} hours {minutes} minutes {seconds} seconds"
35
+ else:
36
+ self.__uptimeInfo.uptime = f"{days} days {hours} hours {minutes} minutes {seconds} seconds"
@@ -0,0 +1,20 @@
1
+ from .linux import UptimeDetectLinux
2
+ from ...pyhwException import OSUnsupportedException
3
+
4
+
5
+ class UptimeDetect:
6
+ """
7
+ Class for system uptime detection.
8
+ """
9
+ def __init__(self, os):
10
+ self.OS = os
11
+
12
+ def getUptime(self):
13
+ """
14
+ Detects the system uptime.
15
+ :return: dataclass UptimeInfo, direct attr: uptime
16
+ """
17
+ if self.OS == "linux":
18
+ return UptimeDetectLinux().getUptimeInfo()
19
+ else:
20
+ raise OSUnsupportedException("Unsupported operating system")
@@ -0,0 +1,3 @@
1
+ from .frontendBase import Printer
2
+
3
+ __all__ = ['Printer']
@@ -0,0 +1,5 @@
1
+ from .colorSet import ColorSet
2
+ from .colorConfig import ColorConfigSet
3
+ from .colorUtil import colorPrefix, colorSuffix
4
+
5
+ __all__ = ["ColorSet", "ColorConfigSet", "colorPrefix", "colorSuffix"]
@@ -0,0 +1,90 @@
1
+ from dataclasses import dataclass
2
+ from .colorSet import ColorSet
3
+
4
+
5
+ class ColorConfigSet:
6
+ def __init__(self, os_name):
7
+ self.__os_name = os_name
8
+
9
+ def getColorConfigSet(self):
10
+ if self.__os_name == "macOS":
11
+ return ColorConfigSetM.macOS
12
+ elif self.__os_name == "debian":
13
+ return ColorConfigSetD.debian
14
+ elif self.__os_name == "linux":
15
+ return ColorConfigSetL.linux
16
+ elif self.__os_name == "fedora":
17
+ return ColorConfigSetF.fedora
18
+ elif self.__os_name == "ubuntu":
19
+ return ColorConfigSetU.ubuntu
20
+ else:
21
+ return ColorConfigSetL.linux # default to Linux
22
+
23
+
24
+ @dataclass
25
+ class ColorConfigSetA:
26
+ pass
27
+
28
+
29
+ @dataclass
30
+ class ColorConfigSetD:
31
+ debian = {
32
+ "colors": [
33
+ ColorSet.COLOR_FG_RED,
34
+ ColorSet.COLOR_FG_LIGHT_BLACK
35
+ ],
36
+ "colorKeys": ColorSet.COLOR_FG_RED,
37
+ "colorTitle": ColorSet.COLOR_FG_RED
38
+ }
39
+
40
+
41
+ @dataclass
42
+ class ColorConfigSetF:
43
+ fedora = {
44
+ "colors": [
45
+ ColorSet.COLOR_FG_BLUE,
46
+ ColorSet.COLOR_FG_WHITE
47
+ ],
48
+ "colorKeys": ColorSet.COLOR_FG_BLUE,
49
+ "colorTitle": ColorSet.COLOR_FG_BLUE
50
+ }
51
+
52
+
53
+ @dataclass
54
+ class ColorConfigSetL:
55
+ linux = {
56
+ "colors": [
57
+ ColorSet.COLOR_FG_WHITE,
58
+ ColorSet.COLOR_FG_BLACK,
59
+ ColorSet.COLOR_FG_YELLOW
60
+ ],
61
+ "colorKeys": ColorSet.COLOR_FG_YELLOW,
62
+ "colorTitle": ColorSet.COLOR_FG_YELLOW
63
+ }
64
+
65
+
66
+ @dataclass
67
+ class ColorConfigSetM:
68
+ macOS = {
69
+ "colors": [
70
+ ColorSet.COLOR_FG_GREEN,
71
+ ColorSet.COLOR_FG_YELLOW,
72
+ ColorSet.COLOR_FG_RED,
73
+ ColorSet.COLOR_FG_MAGENTA,
74
+ ColorSet.COLOR_FG_BLUE
75
+ ],
76
+ "colorKeys": ColorSet.COLOR_FG_YELLOW,
77
+ "colorTitle": ColorSet.COLOR_FG_GREEN
78
+ }
79
+
80
+
81
+ @dataclass
82
+ class ColorConfigSetU:
83
+ ubuntu = {
84
+ "colors": [
85
+ ColorSet.COLOR_FG_RED,
86
+ ColorSet.COLOR_FG_WHITE
87
+ ],
88
+ "colorKeys": ColorSet.COLOR_FG_RED,
89
+ "colorTitle": ColorSet.COLOR_FG_RED
90
+ }
@@ -0,0 +1,58 @@
1
+ from dataclasses import dataclass
2
+
3
+
4
+ @dataclass
5
+ class ColorSet:
6
+ COLOR_MODE_RESET = "0"
7
+ COLOR_MODE_BOLD = "1"
8
+ COLOR_MODE_DIM = "2"
9
+ COLOR_MODE_ITALIC = "3"
10
+ COLOR_MODE_UNDERLINE = "4"
11
+ COLOR_MODE_BLINK = "5"
12
+ COLOR_MODE_INVERSE = "7"
13
+ COLOR_MODE_HIDDEN = "8"
14
+ COLOR_MODE_STRIKETHROUGH = "9"
15
+
16
+ COLOR_FG_BLACK = "30"
17
+ COLOR_FG_RED = "31"
18
+ COLOR_FG_GREEN = "32"
19
+ COLOR_FG_YELLOW = "33"
20
+ COLOR_FG_BLUE = "34"
21
+ COLOR_FG_MAGENTA = "35"
22
+ COLOR_FG_CYAN = "36"
23
+ COLOR_FG_WHITE = "37"
24
+ COLOR_FG_DEFAULT = "39"
25
+
26
+ COLOR_FG_LIGHT_BLACK = "90"
27
+ COLOR_FG_LIGHT_RED = "91"
28
+ COLOR_FG_LIGHT_GREEN = "92"
29
+ COLOR_FG_LIGHT_YELLOW = "93"
30
+ COLOR_FG_LIGHT_BLUE = "94"
31
+ COLOR_FG_LIGHT_MAGENTA = "95"
32
+ COLOR_FG_LIGHT_CYAN = "96"
33
+ COLOR_FG_LIGHT_WHITE = "97"
34
+
35
+ COLOR_BG_BLACK = "40"
36
+ COLOR_BG_RED = "41"
37
+ COLOR_BG_GREEN = "42"
38
+ COLOR_BG_YELLOW = "43"
39
+ COLOR_BG_BLUE = "44"
40
+ COLOR_BG_MAGENTA = "45"
41
+ COLOR_BG_CYAN = "46"
42
+ COLOR_BG_WHITE = "47"
43
+ COLOR_BG_DEFAULT = "49"
44
+
45
+ COLOR_BG_LIGHT_BLACK = "100"
46
+ COLOR_BG_LIGHT_RED = "101"
47
+ COLOR_BG_LIGHT_GREEN = "102"
48
+ COLOR_BG_LIGHT_YELLOW = "103"
49
+ COLOR_BG_LIGHT_BLUE = "104"
50
+ COLOR_BG_LIGHT_MAGENTA = "105"
51
+ COLOR_BG_LIGHT_CYAN = "106"
52
+ COLOR_BG_LIGHT_WHITE = "107"
53
+
54
+ COLOR_FG_256 = "38;5;"
55
+ COLOR_BG_256 = "48;5;"
56
+
57
+ COLOR_FG_RGB = "38;2;"
58
+ COLOR_BG_RGB = "48;2;"
@@ -0,0 +1,6 @@
1
+ def colorPrefix(color):
2
+ return f"\033[{color}m"
3
+
4
+
5
+ def colorSuffix():
6
+ return "\033[0m"
@@ -0,0 +1,69 @@
1
+ from .logo import Logo
2
+ from .color import ColorConfigSet, colorPrefix, colorSuffix, ColorSet
3
+ import re
4
+
5
+
6
+ class Printer:
7
+ def __init__(self, logo_os: str, data: str):
8
+ self.__logo = Logo(logo_os).getLogoContent()
9
+ self.__data = data
10
+ self.__config = ColorConfigSet(logo_os).getColorConfigSet()
11
+ self.__logo_lines = self.__logo.split("\n")
12
+ self.__data_lines = self.__data.strip().split("\n")
13
+ self.__line_length = []
14
+ self.__processed_logo_lines = []
15
+ self.__processed_data_lines = []
16
+ self.__combined_lines = []
17
+ self.__logo_color_indexes = {}
18
+ self.__reg = r'\$(\d)'
19
+
20
+ def cPrint(self):
21
+ self.__LogoPreprocess()
22
+ self.__DataPreprocess()
23
+ max_len_logo = max(self.__line_length)
24
+ for i, (logo_line, data_line) in enumerate(zip(self.__processed_logo_lines, self.__processed_data_lines)):
25
+ combined_line = logo_line + " " * (max_len_logo - self.__line_length[i] + 1) + data_line
26
+ self.__combined_lines.append(combined_line)
27
+
28
+ for i, logo_line in enumerate(self.__processed_logo_lines[len(self.__processed_data_lines):], start=len(self.__processed_data_lines)):
29
+ self.__combined_lines.append(logo_line)
30
+
31
+ for data_line in self.__processed_data_lines[len(self.__processed_logo_lines):]:
32
+ self.__combined_lines.append(" " * max_len_logo + data_line)
33
+
34
+ print("\n".join(self.__combined_lines))
35
+
36
+ def __LogoPreprocess(self):
37
+ global_color = self.__config.get("colors")[0]
38
+ for logo_line in self.__logo_lines:
39
+ matches = re.findall(pattern=self.__reg, string=logo_line)
40
+ color_numbers = len(matches)
41
+ line_length = len(logo_line)
42
+ if color_numbers > 0:
43
+ colors = [int(match) - 1 for match in matches] # color indexes
44
+ temp_line = colorPrefix(ColorSet.COLOR_MODE_BOLD) + colorPrefix(global_color) + logo_line + colorSuffix()
45
+ for color in colors:
46
+ temp_line = temp_line.replace(f"${color+1}", colorPrefix(self.__config.get("colors")[color]))
47
+ global_color = self.__config.get("colors")[colors[-1]] # set the global color to the last used color
48
+ else:
49
+ temp_line = colorPrefix(ColorSet.COLOR_MODE_BOLD) + colorPrefix(global_color) + logo_line + colorSuffix()
50
+ flags_number = len(re.findall(pattern=r'\$\$', string=logo_line)) + len(re.findall(pattern=r'\$\0', string=logo_line))
51
+ if flags_number > 0:
52
+ temp_line = temp_line.replace("$$", "$")
53
+ temp_line = temp_line.replace("$\0", "$")
54
+ self.__line_length.append(line_length - 2 * color_numbers - flags_number)
55
+ self.__processed_logo_lines.append(temp_line)
56
+
57
+ def __DataPreprocess(self):
58
+ header_color = self.__config.get("colorTitle")
59
+ keys_color = self.__config.get("colorKeys")
60
+ self.__processed_data_lines.append(" " + colorPrefix(ColorSet.COLOR_MODE_BOLD) + colorPrefix(header_color) +
61
+ self.__data_lines[0].split("@")[0] + colorSuffix() + colorPrefix(ColorSet.COLOR_MODE_BOLD) +
62
+ "@" + colorPrefix(header_color) +
63
+ self.__data_lines[0].split("@")[1] + colorSuffix())
64
+ self.__processed_data_lines.append(colorSuffix() + self.__data_lines[1])
65
+ for data_line in self.__data_lines[2:]:
66
+ name, value = data_line.split(": ")
67
+ self.__processed_data_lines.append(colorPrefix(ColorSet.COLOR_MODE_BOLD) + colorPrefix(keys_color) + name + ": " + colorSuffix() + value)
68
+
69
+
@@ -0,0 +1,3 @@
1
+ from .logoBase import Logo
2
+
3
+ __all__ = ["Logo"]
@@ -0,0 +1,17 @@
1
+ $2_,met$$$$$$$$$$gg.
2
+ ,g$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$P.
3
+ ,g$$$$P" """Y$$$$.".
4
+ ,$$$$P' `$$$$$$.
5
+ ',$$$$P ,ggs. `$$$$b:
6
+ `d$$$$' ,$P"' $1.$2 $$$$$$
7
+ $$$$P d$' $1,$2 $$$$$$P
8
+ $$$$: $$. $1-$2 ,d$$$$'
9
+ $$$$; Y$b._ _,d$P'
10
+ Y$$$$. $1`.$2`"Y$$$$$$$$P"'
11
+ `$$$$b $1"-.__
12
+ $2`Y$$$$
13
+ `Y$$$$.
14
+ `$$$$b.
15
+ `Y$$$$b.
16
+ `"Y$$b._
17
+ `"""
@@ -0,0 +1,19 @@
1
+ .',;::::;,'.
2
+ .';:cccccccccccc:;,.
3
+ .;cccccccccccccccccccccc;.
4
+ .:cccccccccccccccccccccccccc:.
5
+ .;ccccccccccccc;$2.:dddl:.$1;ccccccc;.
6
+ .:ccccccccccccc;$2OWMKOOXMWd$1;ccccccc:.
7
+ .:ccccccccccccc;$2KMMc$1;cc;$2xMMc$1;ccccccc:.
8
+ ,cccccccccccccc;$2MMM.$1;cc;$2;WW:$1;cccccccc,
9
+ :cccccccccccccc;$2MMM.$1;cccccccccccccccc:
10
+ :ccccccc;$2oxOOOo$1;$2MMM000k.$1;cccccccccccc:
11
+ cccccc;$20MMKxdd:$1;$2MMMkddc.$1;cccccccccccc;
12
+ ccccc;$2XMO'$1;cccc;$2MMM.$1;cccccccccccccccc'
13
+ ccccc;$2MMo$1;ccccc;$2MMW.$1;ccccccccccccccc;
14
+ ccccc;$20MNc.$1ccc$2.xMMd$1;ccccccccccccccc;
15
+ cccccc;$2dNMWXXXWM0:$1;cccccccccccccc:,
16
+ cccccccc;$2.:odl:.$1;cccccccccccccc:,.
17
+ ccccccccccccccccccccccccccccc:'.
18
+ :ccccccccccccccccccccccc:;,..
19
+ ':cccccccccccccccc::;,.
@@ -0,0 +1,12 @@
1
+ $2#####
2
+ $2#######
3
+ $2##$1O$2#$1O$2##
4
+ $2#$3#####$2#
5
+ $2##$1##$3###$1##$2##
6
+ $2#$1##########$2##
7
+ $2#$1############$2##
8
+ $2#$1############$2###
9
+ $3##$2#$1###########$2##$3#
10
+ $3######$2#$1#######$2#$3######
11
+ $3#######$2#$1#####$2#$3#######
12
+ $3#####$2#######$3#####
@@ -0,0 +1,17 @@
1
+ $1..'
2
+ ,xNMM.
3
+ .OMMMMo
4
+ lMM"
5
+ .;loddo:. .olloddol;.
6
+ cKMMMMMMMMMMNWMMMMMMMMMM0:
7
+ $2.KMMMMMMMMMMMMMMMMMMMMMMMWd.
8
+ XMMMMMMMMMMMMMMMMMMMMMMMX.
9
+ $3;MMMMMMMMMMMMMMMMMMMMMMMM:
10
+ :MMMMMMMMMMMMMMMMMMMMMMMM:
11
+ .MMMMMMMMMMMMMMMMMMMMMMMMX.
12
+ kMMMMMMMMMMMMMMMMMMMMMMMMWd.
13
+ $4'XMMMMMMMMMMMMMMMMMMMMMMMMMMk
14
+ 'XMMMMMMMMMMMMMMMMMMMMMMMMK.
15
+ $5kMMMMMMMMMMMMMMMMMMMMMMd
16
+ ;KMMMMMMMWXXWMMMMMMMk.
17
+ "cooc*" "*coo'"
@@ -0,0 +1,20 @@
1
+ --+oossssssoo+--
2
+ .:+ssssssssssssssssss+:.
3
+ -+ssssssssssssssssssyyssss+-
4
+ .ossssssssssssssssssd$2MMMNy$1sssso.
5
+ /sssssssssss$2hdmmNNmmyNMMMMh$1ssssss/
6
+ +sssssssss$2hmydMMMMMMMNddddy$1ssssssss+
7
+ /ssssssss$2hNMMMyhhyyyyhmNMMMNh$1ssssssss/
8
+ .ssssssss$2dMMMNh$1ssssssssss$2hNMMMd$1ssssssss.
9
+ +ssss$2hhhyNMMNy$1ssssssssssss$2yNMMMy$1sssssss+
10
+ oss$2yNMMMNyMMh$1ssssssssssssss$2hmmmh$1ssssssso
11
+ oss$2yNMMMNyMMh$1ssssssssssssss$2hmmmh$1ssssssso
12
+ +ssss$2hhhyNMMNy$1ssssssssssss$2yNMMMy$1sssssss+
13
+ .ssssssss$2dMMMNh$1ssssssssss$2hNMMMd$1ssssssss.
14
+ /ssssssss$2hNMMMyhhyyyyhdNMMMNh$1ssssssss/
15
+ +sssssssss$2dmydMMMMMMMMddddy$1ssssssss+
16
+ /sssssssssss$2hdmNNNNmyNMMMMh$1ssssss/
17
+ .ossssssssssssssssss$2dMMMNy$1sssso.
18
+ -+sssssssssssssssss$2yyy$1ssss+-
19
+ `:+ssssssssssssssssss+:´
20
+ --+oossssssoo+--
@@ -0,0 +1,22 @@
1
+ from ...pyhwException import LogoNotFoundException
2
+ from pathlib import Path
3
+ import os
4
+
5
+
6
+ class Logo:
7
+ def __init__(self, logo_os):
8
+ self.__logo_os = logo_os
9
+ self.__logo_ascii = ""
10
+
11
+ def getLogoContent(self):
12
+ self.__loadLogoAscii()
13
+ return self.__logo_ascii
14
+
15
+ def __loadLogoAscii(self):
16
+ try:
17
+ file_path = os.path.join(Path(__file__).parent, f"ascii/{self.__logo_os}.pyhw")
18
+ with open(file_path, "r") as f:
19
+ self.__logo_ascii = f.read()
20
+ except FileNotFoundError:
21
+ raise LogoNotFoundException(f"Logo for {self.__logo_os} not found.")
22
+
pyhw/macos.py ADDED
@@ -0,0 +1,146 @@
1
+ import subprocess
2
+ import json
3
+ import platform
4
+ from pyhwException import GPUNotFoundException, BackendException
5
+
6
+
7
+ class GPUInfo:
8
+ def __init__(self, verbose=False):
9
+ self._gpus = list()
10
+ self._verbose = verbose
11
+
12
+ def init(self):
13
+ pass
14
+
15
+ def _get_gpu_info(self):
16
+ try:
17
+ gpus = json.loads(subprocess.check_output(["system_profiler", "SPDisplaysDataType", "-json"])).get('SPDisplaysDataType')
18
+ if gpus is not None:
19
+ if self._verbose:
20
+ print(f"Detected {len(gpus)} GPU(s).")
21
+ else:
22
+ raise GPUNotFoundException("No GPU information found.")
23
+ except Exception as e:
24
+ raise BackendException(f"An error occurred while getting GPU info: {e}")
25
+
26
+ gpu_info_list = list()
27
+
28
+ for i in range(len(gpus)):
29
+ gpu = gpus[i]
30
+ info = dict()
31
+ info["name"] = gpu.get("sppci_model")
32
+ if gpu.get("spdisplays_vendor") == "sppci_vendor_Apple":
33
+ info["vram"] = f"{get_mem_info()} (shared memory)"
34
+ else:
35
+ info["vram"] = gpu.get("spdisplays_vram")
36
+ info["vendor"] = gpu.get("spdisplays_vendor")
37
+ info["cores"] = gpu.get("sppci_cores")
38
+ info["metal"] = gpu.get("spdisplays_mtlgpufamilysupport")
39
+ info["bus"] = gpu.get("sppci_bus")
40
+ info["link"] = gpu.get("spdisplays_pcie_width")
41
+ gpu_info_list.append(info)
42
+
43
+ @staticmethod
44
+ def _handleVendor(vendor):
45
+ if vendor == "sppci_vendor_Apple":
46
+ return "Apple"
47
+ elif vendor == "sppci_vendor_intel":
48
+ return "Intel"
49
+ elif vendor == "sppci_vendor_amd":
50
+ return "AMD"
51
+ else:
52
+ return vendor
53
+
54
+ @staticmethod
55
+ def _handleVram(vram, vendor):
56
+ if vendor == "Apple":
57
+ return f"{get_mem_info()} (shared memory)"
58
+ else:
59
+ return vram
60
+
61
+ @staticmethod
62
+ def _getVramApple():
63
+ try:
64
+ return json.loads(subprocess.check_output(["system_profiler", "SPHardwareDataType", "-json"]))["SPHardwareDataType"][0]["physical_memory"]
65
+ except Exception as e:
66
+ raise BackendException(f"An error occurred while getting memory info: {e}")
67
+
68
+
69
+ class GPU:
70
+ def __init__(self):
71
+ self._name = str()
72
+ self._vram = str()
73
+ self._vendor = str()
74
+ self._cores = str()
75
+ self._metal = str()
76
+ self._bus = str()
77
+ self._bus_width = str()
78
+ self._id = int()
79
+
80
+ def init(self):
81
+ pass
82
+
83
+ def _get_gpu_info(self):
84
+ pass
85
+
86
+
87
+
88
+
89
+ def get_mem_info():
90
+ try:
91
+ mem_info_dict = json.loads(subprocess.check_output(["system_profiler", "SPHardwareDataType", "-json"]))
92
+ mem_info = mem_info_dict["SPHardwareDataType"][0]["physical_memory"]
93
+ return mem_info
94
+ except Exception as e:
95
+ print(f"An error occurred while getting memory info: {e}")
96
+ exit(-1)
97
+
98
+
99
+ def get_gpu_info():
100
+ gpus = list()
101
+ try:
102
+ gpu_info_dict = json.loads(subprocess.check_output(["system_profiler", "SPDisplaysDataType", "-json"]))
103
+ if 'SPDisplaysDataType' in gpu_info_dict:
104
+ gpus = gpu_info_dict['SPDisplaysDataType']
105
+ print(f"Detected {len(gpus)} GPU(s).")
106
+ else:
107
+ print("No GPU information found.")
108
+ except Exception as e:
109
+ print(f"An error occurred while getting GPU info: {e}")
110
+ exit(-1)
111
+
112
+ gpu_info_list = list()
113
+
114
+ for i in range(len(gpus)):
115
+ gpu = gpus[i]
116
+ info = dict()
117
+ info["name"] = gpu.get("sppci_model")
118
+ if gpu.get("spdisplays_vendor") == "sppci_vendor_Apple":
119
+ info["vram"] = f"{get_mem_info()} (shared memory)"
120
+ else:
121
+ info["vram"] = gpu.get("spdisplays_vram")
122
+ info["vendor"] = gpu.get("spdisplays_vendor")
123
+ info["cores"] = gpu.get("sppci_cores")
124
+ info["metal"] = gpu.get("spdisplays_mtlgpufamilysupport")
125
+ info["bus"] = gpu.get("sppci_bus")
126
+ info["link"] = gpu.get("spdisplays_pcie_width")
127
+ gpu_info_list.append(info)
128
+ return gpu_info_list
129
+
130
+
131
+ if __name__ == "__main__":
132
+ li = get_gpu_info()
133
+ for i in range(len(li)):
134
+ info = li[i]
135
+ print('----------')
136
+ print(f"GPU {i}:")
137
+ print(f'name: {info["name"]}')
138
+ print(f'vram: {info["vram"]}')
139
+ print(f'vendor: {info["vendor"]}')
140
+ print(f'cores: {info["cores"]}')
141
+ print(f'metal: {info["metal"]}')
142
+ print(f'bus: {info["bus"]}')
143
+ print(f'link: {info["link"]}')
144
+
145
+ print('----------')
146
+
@@ -0,0 +1,3 @@
1
+ from .pyhwException import OSUnsupportedException, BackendException, GPUNotFoundException, LogoNotFoundException
2
+
3
+ __all__ = ["OSUnsupportedException", "BackendException", "GPUNotFoundException", "LogoNotFoundException"]
@@ -0,0 +1,14 @@
1
+ class GPUNotFoundException(Exception):
2
+ pass
3
+
4
+
5
+ class BackendException(Exception):
6
+ pass
7
+
8
+
9
+ class OSUnsupportedException(Exception):
10
+ pass
11
+
12
+
13
+ class LogoNotFoundException(Exception):
14
+ pass
@@ -0,0 +1,3 @@
1
+ from .pyhwUtil import getOS, getArch, createDataString
2
+
3
+ __all__ = ["getOS", "getArch", "createDataString"]
@@ -0,0 +1,50 @@
1
+ import platform
2
+ from ..backend import Data
3
+
4
+ def getOS():
5
+ """
6
+ Get the os type in lower case.
7
+ :return: str, os type.
8
+ """
9
+ system = platform.system()
10
+ if system == "Windows":
11
+ return "windows"
12
+ elif system == "Linux":
13
+ return "linux"
14
+ elif system == "Darwin":
15
+ return "macos"
16
+ else:
17
+ return "unknown"
18
+
19
+ def getArch():
20
+ """
21
+ Get the machine architecture.
22
+ :return: str, value in [x86_64, x86, aarch64, arm32].
23
+ """
24
+ arch = platform.machine()
25
+ if arch == "x86_64" or arch == "AMD64" or arch == "amd64":
26
+ return "x86_64"
27
+ elif arch == "i386" or arch == "i686" or arch == "x86":
28
+ return "x86"
29
+ elif arch == "aarch64":
30
+ return "aarch64"
31
+ elif arch.find("arm") != -1:
32
+ return "arm32"
33
+ else:
34
+ return "unknown"
35
+
36
+
37
+ def createDataString(data: Data):
38
+ data_string = f"""
39
+ {data.title}
40
+ {"-"*len(data.title)}
41
+ OS: {data.OS}
42
+ Host: {data.Host}
43
+ Kernel: {data.Kernel}
44
+ Uptime: {data.Uptime}
45
+ Shell: {data.Shell}
46
+ CPU: {data.CPU}
47
+ GPU: {data.GPU[0]}
48
+ Memory: {data.Memory}
49
+ """
50
+ return data_string