nschloe / tiptop

:desktop_computer: Command-line system monitoring

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

AttributeError: 'ProcsList' object has no attribute 'panel'

eriktelepovsky opened this issue · comments

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

I need more of the error message.

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'

You can close the issue. Solved by upgrading psutil from 5.6.5 to 5.8.0. Thank you.