AttributeError: 'ProcsList' object has no attribute 'panel'
eriktelepovsky opened this issue · comments
Erik Telepovský commented
Hello. I am trying to install tiptop, but I get this error:
pip install tiptop
│ /Users/erik/env/swida/lib/python3.9/site-packages/tiptop/_procs_list.py:112 in render │
│ │
│ 109 │ │ self.refresh() ╭─────────────── locals ───────────────╮ │
│ 110 │ │ self = ProcsList(name='ProcsList#1') │ │
│ 111 │ def render(self) -> Panel: ╰──────────────────────────────────────╯ │
│ ❱ 112 │ │ return self.panel │
│ 113 │ │
│ 114 │ async def on_resize(self, event): │
│ 115 │ │ self.max_num_procs = event.height - 3 │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
AttributeError: 'ProcsList' object has no attribute 'panel'
Using:
Python 3.9.7
pip 21.3.1
tiptop 0.0.10
macOS Big Sur
Apple Silicon M1
Nico Schlömer commented
I need more of the error message.
Erik Telepovský commented
Sure. Here is the whole stacktrace:
(swida) erik@Lucias-MacBook-Air tmp % tiptop
╭─────────────────────────────────────────────────────────────────── Traceback (most recent call last) ────────────────────────────────────────────────────────────────────╮
│ │
│ /Users/erik/env/swida/lib/python3.9/site-packages/tiptop/_procs_list.py:27 in on_mount │
│ │
│ 24 │ │ │ self.tiptop_string += f" v{__version__}" ╭────────────────── locals ───────────────────╮ │
│ 25 │ │ │ __version__ = '0.0.10' │ │
│ 26 │ │ self.max_num_procs = 100 │ self = ProcsList(name='ProcsList#1') │ │
│ ❱ 27 │ │ self.collect_data() ╰─────────────────────────────────────────────╯ │
│ 28 │ │ self.set_interval(6.0, self.collect_data) │
│ 29 │ │
│ 30 │ def collect_data(self): │
│ /Users/erik/env/swida/lib/python3.9/site-packages/tiptop/_procs_list.py:41 in collect_data │
│ │
│ 38 │ │ │ "memory_info", │
│ 39 │ │ │ "status", │
│ 40 │ │ ] │
│ ❱ 41 │ │ processes = sorted( │
│ 42 │ │ │ psutil.process_iter(attrs), │
│ 43 │ │ │ # The item.info["cpu_percent"] can be `ad_value` (default None). │
│ 44 │ │ │ # It gets assigned to a dict key in case AccessDenied or │
│ │
│ ╭─────────────────────────────────────────────── locals ────────────────────────────────────────────────╮ │
│ │ attrs = ['pid', 'name', 'username', 'cmdline', 'cpu_percent', 'num_threads', 'memory_info', 'status'] │ │
│ │ self = ProcsList(name='ProcsList#1') │ │
│ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /Users/erik/env/swida/lib/python3.9/site-packages/psutil/__init__.py:1565 in process_iter │
│ │
│ 1562 │ for pid, proc in ls: │
│ 1563 │ │ try: │
│ 1564 │ │ │ if proc is None: # new process │
│ ❱ 1565 │ │ │ │ yield add(pid) │
│ 1566 │ │ │ else: │
│ 1567 │ │ │ │ # use is_running() to check whether PID has been reused by │
│ 1568 │ │ │ │ # another process in which case yield a new Process instance │
│ │
│ ╭─────────────────────────────────────────────────────────────────────── locals ───────────────────────────────────────────────────────────────────────╮ │
│ │ a = {0, 1, 51203, 49167, 81938, 65561, 36892, 51229, 6175, 51239, ... +648} │ │
│ │ ad_value = None │ │
│ │ add = <function process_iter.<locals>.add at 0x105a63280> │ │
│ │ attrs = ['pid', 'name', 'username', 'cmdline', 'cpu_percent', 'num_threads', 'memory_info', 'status'] │ │
│ │ b = set() │ │
│ │ gone_pids = set() │ │
│ │ ls = [(0, None), (1, None), (284, None), (285, None), (287, None), (288, None), (289, None), (290, None), (293, None), (296, None), ... +648] │ │
│ │ new_pids = {0, 1, 51203, 49167, 81938, 65561, 36892, 51229, 6175, 51239, ... +648} │ │
│ │ pid = 50897 │ │
│ │ proc = None │ │
│ │ remove = <function process_iter.<locals>.remove at 0x105b37430> │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /Users/erik/env/swida/lib/python3.9/site-packages/psutil/__init__.py:1542 in add │
│ │
│ 1539 │ def add(pid): │
│ 1540 │ │ proc = Process(pid) │
│ 1541 │ │ if attrs is not None: │
│ ❱ 1542 │ │ │ proc.info = proc.as_dict(attrs=attrs, ad_value=ad_value) │
│ 1543 │ │ with _lock: │
│ 1544 │ │ │ _pmap[proc.pid] = proc │
│ 1545 │ │ return proc │
│ │
│ ╭───────────────────────────────────────────────── locals ─────────────────────────────────────────────────╮ │
│ │ ad_value = None │ │
│ │ attrs = ['pid', 'name', 'username', 'cmdline', 'cpu_percent', 'num_threads', 'memory_info', 'status'] │ │
│ │ pid = 50897 │ │
│ │ proc = <repr-error '[Errno 5] Input/output error'> │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /Users/erik/env/swida/lib/python3.9/site-packages/psutil/__init__.py:639 in as_dict │
│ │
│ 636 │ │ │ │ │ │ ret = self.pid │
│ 637 │ │ │ │ │ else: │
│ 638 │ │ │ │ │ │ meth = getattr(self, name) │
│ ❱ 639 │ │ │ │ │ │ ret = meth() │
│ 640 │ │ │ │ except (AccessDenied, ZombieProcess): │
│ 641 │ │ │ │ │ ret = ad_value │
│ 642 │ │ │ │ except NotImplementedError: │
│ │
│ ╭────────────────────────────────────────────────────────────────────── locals ──────────────────────────────────────────────────────────────────────╮ │
│ │ ad_value = None │ │
│ │ attrs = {'num_threads', 'memory_info', 'pid', 'username', 'name', 'cpu_percent', 'status', 'cmdline'} │ │
│ │ invalid_names = set() │ │
│ │ ls = {'num_threads', 'memory_info', 'pid', 'username', 'name', 'cpu_percent', 'status', 'cmdline'} │ │
│ │ meth = <repr-error '[Errno 5] Input/output error'> │ │
│ │ name = 'name' │ │
│ │ ret = 'erik' │ │
│ │ retdict = {'num_threads': 3, 'memory_info': pmem(rss=11272192, vms=9206550528, pfaults=3661, pageins=171), 'pid': 50897, 'username': 'erik'} │ │
│ │ self = <repr-error '[Errno 5] Input/output error'> │ │
│ │ valid_names = {'cwd', 'cpu_times', 'environ', 'pid', 'cpu_percent', 'cmdline', 'username', 'status', 'num_fds', 'memory_full_info', ... +15} │ │
│ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /Users/erik/env/swida/lib/python3.9/site-packages/psutil/__init__.py:738 in name │
│ │
│ 735 │ │ │ # one instead because it's usually more explicative. ╭────────────────────── locals ──────────────────────╮ │
│ 736 │ │ │ # Examples are "gnome-keyring-d" vs. "gnome-keyring-daemon". │ name = 'CarbonComponentS' │ │
│ 737 │ │ │ try: │ self = <repr-error '[Errno 5] Input/output error'> │ │
│ ❱ 738 │ │ │ │ cmdline = self.cmdline() ╰────────────────────────────────────────────────────╯ │
│ 739 │ │ │ except AccessDenied: │
│ 740 │ │ │ │ pass │
│ 741 │ │ │ else: │
│ │
│ /Users/erik/env/swida/lib/python3.9/site-packages/psutil/__init__.py:791 in cmdline │
│ │
│ 788 │ ╭────────────────────── locals ──────────────────────╮ │
│ 789 │ def cmdline(self): │ self = <repr-error '[Errno 5] Input/output error'> │ │
│ 790 │ │ """The command line this process has been called with.""" ╰────────────────────────────────────────────────────╯ │
│ ❱ 791 │ │ return self._proc.cmdline() │
│ 792 │ │
│ 793 │ def status(self): │
│ 794 │ │ """The process current status as a STATUS_* constant.""" │
│ │
│ /Users/erik/env/swida/lib/python3.9/site-packages/psutil/_psosx.py:338 in wrapper │
│ │
│ 335 │ @functools.wraps(fun) ╭──────────────────────── locals ────────────────────────╮ │
│ 336 │ def wrapper(self, *args, **kwargs): │ args = () │ │
│ 337 │ │ try: │ fun = <function Process.cmdline at 0x1058e53a0> │ │
│ ❱ 338 │ │ │ return fun(self, *args, **kwargs) │ kwargs = {} │ │
│ 339 │ │ except ProcessLookupError: │ self = <psutil._psosx.Process object at 0x105c38940> │ │
│ 340 │ │ │ raise NoSuchProcess(self.pid, self._name) ╰────────────────────────────────────────────────────────╯ │
│ 341 │ │ except PermissionError: │
│ │
│ /Users/erik/env/swida/lib/python3.9/site-packages/psutil/_psosx.py:422 in cmdline │
│ │
│ 419 │ @wrap_exceptions ╭─────────────────────── locals ───────────────────────╮ │
│ 420 │ def cmdline(self): │ self = <psutil._psosx.Process object at 0x105c38940> │ │
│ 421 │ │ with catch_zombie(self): ╰──────────────────────────────────────────────────────╯ │
│ ❱ 422 │ │ │ return cext.proc_cmdline(self.pid) │
│ 423 │ │
│ 424 │ @wrap_exceptions │
│ 425 │ def environ(self): │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
OSError: [Errno 5] Input/output error
╭─────────────────────────────────────────────────────────────────── Traceback (most recent call last) ────────────────────────────────────────────────────────────────────╮
│ │
│ /Users/erik/env/swida/lib/python3.9/site-packages/textual/widget.py:202 in _get_lines │
│ │
│ 199 │ def _get_lines(self) -> Lines: ╭─────────────── locals ───────────────╮ │
│ 200 │ │ """Get segment lines to render the widget.""" │ self = ProcsList(name='ProcsList#1') │ │
│ 201 │ │ if self.render_cache is None: ╰──────────────────────────────────────╯ │
│ ❱ 202 │ │ │ self.render_lines() │
│ 203 │ │ assert self.render_cache is not None │
│ 204 │ │ lines = self.render_cache.lines │
│ 205 │ │ return lines │
│ /Users/erik/env/swida/lib/python3.9/site-packages/textual/widget.py:188 in render_lines │
│ │
│ 185 │ ╭──────────────── locals ────────────────╮ │
│ 186 │ def render_lines(self) -> None: │ height = 15 │ │
│ 187 │ │ width, height = self.size │ self = ProcsList(name='ProcsList#1') │ │
│ ❱ 188 │ │ renderable = self.render_styled() │ width = 107 │ │
│ 189 │ │ options = self.console.options.update_dimensions(width, height) ╰────────────────────────────────────────╯ │
│ 190 │ │ lines = self.console.render_lines(renderable, options) │
│ 191 │ │ self.render_cache = RenderCache(self.size, lines) │
│ │
│ /Users/erik/env/swida/lib/python3.9/site-packages/textual/widget.py:128 in render_styled │
│ │
│ 125 │ │ Returns: ╭─────────────── locals ───────────────╮ │
│ 126 │ │ │ RenderableType: A new renderable. │ self = ProcsList(name='ProcsList#1') │ │
│ 127 │ │ """ ╰──────────────────────────────────────╯ │
│ ❱ 128 │ │ renderable = self.render() │
│ 129 │ │ if self.padding is not None: │
│ 130 │ │ │ renderable = Padding(renderable, self.padding) │
│ 131 │ │ if self.border in self.BOX_MAP: │
│ │
│ /Users/erik/env/swida/lib/python3.9/site-packages/tiptop/_procs_list.py:112 in render │
│ │
│ 109 │ │ self.refresh() ╭─────────────── locals ───────────────╮ │
│ 110 │ │ self = ProcsList(name='ProcsList#1') │ │
│ 111 │ def render(self) -> Panel: ╰──────────────────────────────────────╯ │
│ ❱ 112 │ │ return self.panel │
│ 113 │ │
│ 114 │ async def on_resize(self, event): │
│ 115 │ │ self.max_num_procs = event.height - 3 │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
AttributeError: 'ProcsList' object has no attribute 'panel'
╭─────────────────────────────────────────────────────────────────── Traceback (most recent call last) ────────────────────────────────────────────────────────────────────╮
│ │
│ /Users/erik/env/swida/lib/python3.9/site-packages/textual/widget.py:202 in _get_lines │
│ │
│ 199 │ def _get_lines(self) -> Lines: ╭─────────────── locals ───────────────╮ │
│ 200 │ │ """Get segment lines to render the widget.""" │ self = ProcsList(name='ProcsList#1') │ │
│ 201 │ │ if self.render_cache is None: ╰──────────────────────────────────────╯ │
│ ❱ 202 │ │ │ self.render_lines() │
│ 203 │ │ assert self.render_cache is not None │
│ 204 │ │ lines = self.render_cache.lines │
│ 205 │ │ return lines │
│ /Users/erik/env/swida/lib/python3.9/site-packages/textual/widget.py:188 in render_lines │
│ │
│ 185 │ ╭──────────────── locals ────────────────╮ │
│ 186 │ def render_lines(self) -> None: │ height = 15 │ │
│ 187 │ │ width, height = self.size │ self = ProcsList(name='ProcsList#1') │ │
│ ❱ 188 │ │ renderable = self.render_styled() │ width = 107 │ │
│ 189 │ │ options = self.console.options.update_dimensions(width, height) ╰────────────────────────────────────────╯ │
│ 190 │ │ lines = self.console.render_lines(renderable, options) │
│ 191 │ │ self.render_cache = RenderCache(self.size, lines) │
│ │
│ /Users/erik/env/swida/lib/python3.9/site-packages/textual/widget.py:128 in render_styled │
│ │
│ 125 │ │ Returns: ╭─────────────── locals ───────────────╮ │
│ 126 │ │ │ RenderableType: A new renderable. │ self = ProcsList(name='ProcsList#1') │ │
│ 127 │ │ """ ╰──────────────────────────────────────╯ │
│ ❱ 128 │ │ renderable = self.render() │
│ 129 │ │ if self.padding is not None: │
│ 130 │ │ │ renderable = Padding(renderable, self.padding) │
│ 131 │ │ if self.border in self.BOX_MAP: │
│ │
│ /Users/erik/env/swida/lib/python3.9/site-packages/tiptop/_procs_list.py:112 in render │
│ │
│ 109 │ │ self.refresh() ╭─────────────── locals ───────────────╮ │
│ 110 │ │ self = ProcsList(name='ProcsList#1') │ │
│ 111 │ def render(self) -> Panel: ╰──────────────────────────────────────╯ │
│ ❱ 112 │ │ return self.panel │
│ 113 │ │
│ 114 │ async def on_resize(self, event): │
│ 115 │ │ self.max_num_procs = event.height - 3 │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
AttributeError: 'ProcsList' object has no attribute 'panel'
╭─────────────────────────────────────────────────────────────────── Traceback (most recent call last) ────────────────────────────────────────────────────────────────────╮
│ │
│ /Users/erik/env/swida/lib/python3.9/site-packages/textual/widget.py:202 in _get_lines │
│ │
│ 199 │ def _get_lines(self) -> Lines: ╭─────────────── locals ───────────────╮ │
│ 200 │ │ """Get segment lines to render the widget.""" │ self = ProcsList(name='ProcsList#1') │ │
│ 201 │ │ if self.render_cache is None: ╰──────────────────────────────────────╯ │
│ ❱ 202 │ │ │ self.render_lines() │
│ 203 │ │ assert self.render_cache is not None │
│ 204 │ │ lines = self.render_cache.lines │
│ 205 │ │ return lines │
│ /Users/erik/env/swida/lib/python3.9/site-packages/textual/widget.py:188 in render_lines │
│ │
│ 185 │ ╭──────────────── locals ────────────────╮ │
│ 186 │ def render_lines(self) -> None: │ height = 15 │ │
│ 187 │ │ width, height = self.size │ self = ProcsList(name='ProcsList#1') │ │
│ ❱ 188 │ │ renderable = self.render_styled() │ width = 107 │ │
│ 189 │ │ options = self.console.options.update_dimensions(width, height) ╰────────────────────────────────────────╯ │
│ 190 │ │ lines = self.console.render_lines(renderable, options) │
│ 191 │ │ self.render_cache = RenderCache(self.size, lines) │
│ │
│ /Users/erik/env/swida/lib/python3.9/site-packages/textual/widget.py:128 in render_styled │
│ │
│ 125 │ │ Returns: ╭─────────────── locals ───────────────╮ │
│ 126 │ │ │ RenderableType: A new renderable. │ self = ProcsList(name='ProcsList#1') │ │
│ 127 │ │ """ ╰──────────────────────────────────────╯ │
│ ❱ 128 │ │ renderable = self.render() │
│ 129 │ │ if self.padding is not None: │
│ 130 │ │ │ renderable = Padding(renderable, self.padding) │
│ 131 │ │ if self.border in self.BOX_MAP: │
│ │
│ /Users/erik/env/swida/lib/python3.9/site-packages/tiptop/_procs_list.py:112 in render │
│ │
│ 109 │ │ self.refresh() ╭─────────────── locals ───────────────╮ │
│ 110 │ │ self = ProcsList(name='ProcsList#1') │ │
│ 111 │ def render(self) -> Panel: ╰──────────────────────────────────────╯ │
│ ❱ 112 │ │ return self.panel │
│ 113 │ │
│ 114 │ async def on_resize(self, event): │
│ 115 │ │ self.max_num_procs = event.height - 3 │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
AttributeError: 'ProcsList' object has no attribute 'panel'
Erik Telepovský commented
You can close the issue. Solved by upgrading psutil from 5.6.5 to 5.8.0. Thank you.