如何修复 linux 上的 psutil 导入错误 "permission denied"?

How to fix psutil import error "permission denied" on linux?

我正在尝试为 termux 编写脚本。我需要将 psutil 与 python 一起使用。它工作正常。但是每次我尝试 运行 脚本时,它都会给我一些错误,这不会影响我的代码。

我尝试过使用“try”、“except”来捕获错误。但是没用。

注意:请参阅错误消息的最后一行。脚本工作正常。如果您要提供其他模块或解决方案,请记住“我不能在我的脚本上使用 os.kill”。

代码:

try:
    import psutil, os, signal
except Exception as e:
    pass

print ("killing python")
proc = psutil.Process(os.getpid())
proc.send_signal(signal.SIGTERM)

错误 + 输出:

 Traceback (most recent call last):

 File "/data/data/com.termux/files/usr/lib/python3.8/site-packages/psutil/_common.py", line 110, in wrapper
    return cache[key]
KeyError: (('/proc',), frozenset())

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/data/data/com.termux/files/usr/lib/python3.8/site-packages/psutil/_pslinux.py", line 202, in <module>
    scputimes = set_scputimes_ntuple("/proc")
  File "/data/data/com.termux/files/usr/lib/python3.8/site-packages/psutil/_common.py", line 112, in wrapper
    ret = cache[key] = fun(*args, **kwargs)
  File "/data/data/com.termux/files/usr/lib/python3.8/site-packages/psutil/_pslinux.py", line 184, in set_scputimes_ntuple
    with open_binary('%s/stat' % procfs_path) as f:
  File "/data/data/com.termux/files/usr/lib/python3.8/site-packages/psutil/_pslinux.py", line 138, in open_binary
    return open(fname, "rb", **kwargs)
PermissionError: [Errno 13] Permission denied: '/proc/stat'
Traceback (most recent call last):
  File "/data/data/com.termux/files/usr/lib/python3.8/site-packages/psutil/_common.py", line 110, in wrapper
    return cache[key]
KeyError: (('/proc',), frozenset())

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/data/data/com.termux/files/usr/lib/python3.8/site-packages/psutil/__init__.py", line 1435, in <module>
    _last_cpu_times = cpu_times()
  File "/data/data/com.termux/files/usr/lib/python3.8/site-packages/psutil/__init__.py", line 1429, in cpu_times
    return _psplatform.cpu_times()
  File "/data/data/com.termux/files/usr/lib/python3.8/site-packages/psutil/_pslinux.py", line 301, in cpu_times
    set_scputimes_ntuple(procfs_path)
  File "/data/data/com.termux/files/usr/lib/python3.8/site-packages/psutil/_common.py", line 112, in wrapper
    ret = cache[key] = fun(*args, **kwargs)
  File "/data/data/com.termux/files/usr/lib/python3.8/site-packages/psutil/_pslinux.py", line 184, in set_scputimes_ntuple
    with open_binary('%s/stat' % procfs_path) as f:
  File "/data/data/com.termux/files/usr/lib/python3.8/site-packages/psutil/_pslinux.py", line 138, in open_binary
    return open(fname, "rb", **kwargs)
PermissionError: [Errno 13] Permission denied: '/proc/stat'
Traceback (most recent call last):
  File "/data/data/com.termux/files/usr/lib/python3.8/site-packages/psutil/_common.py", line 110, in wrapper
    return cache[key]
KeyError: (('/proc',), frozenset())

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/data/data/com.termux/files/usr/lib/python3.8/site-packages/psutil/__init__.py", line 1442, in <module>
    _last_per_cpu_times = cpu_times(percpu=True)
  File "/data/data/com.termux/files/usr/lib/python3.8/site-packages/psutil/__init__.py", line 1431, in cpu_times
    return _psplatform.per_cpu_times()
  File "/data/data/com.termux/files/usr/lib/python3.8/site-packages/psutil/_pslinux.py", line 314, in per_cpu_times
    set_scputimes_ntuple(procfs_path)
  File "/data/data/com.termux/files/usr/lib/python3.8/site-packages/psutil/_common.py", line 112, in wrapper
    ret = cache[key] = fun(*args, **kwargs)
  File "/data/data/com.termux/files/usr/lib/python3.8/site-packages/psutil/_pslinux.py", line 184, in set_scputimes_ntuple
    with open_binary('%s/stat' % procfs_path) as f:
  File "/data/data/com.termux/files/usr/lib/python3.8/site-packages/psutil/_pslinux.py", line 138, in open_binary
    return open(fname, "rb", **kwargs)
PermissionError: [Errno 13] Permission denied: '/proc/stat'

killing python
Terminated

如果我想忽略错误消息。我可以使用下面的代码,因为它不会干扰我的实际程序。

import os, signal, sys

# set stderr to dev/null

sys.stderr = open(os.devnull, "w")
import psutil

# after importing, set stderr to original 
sys.stderr = sys.__stderr__

print ("killing python")
proc = psutil.Process(os.getpid())
proc.send_signal(signal.SIGTERM)

输出:

killing python
Terminated

也可以按照@TheoRet提到的方式妥善处理:

import os,sys

sys.stderr = open(os.devnull, "w")
try:
  import psutil 
#except:
  #handle module not found 
finally:
  sys.stderr = sys.__stderr__

这样,所有实际阻止“import psutil”行执行的异常都会显示出来。以防 psutil 出现真正的问题(即缺少依赖模块)。

今天我在 android 上的 termux 中导入 psutil 时遇到了同样的问题。 lindroid 先生找到的解决方案/解决方法有助于避免出现烦人的错误消息。感谢分享!

我想提出一个小小的改进:

import os,sys

sys.stderr = open(os.devnull, "w")
try:
  import psutil
finally:
  sys.stderr = sys.__stderr__

这样,所有实际阻止“import psutil”行执行的异常都会显示出来。以防 psutil 出现真正的问题(即缺少依赖模块)。

您知道为什么正常的 try/except 语句无法捕获最初发布的错误吗?它可能是在第二个线程中提出的吗?我已经尝试操纵 Thread class 来处理错误,但它没有用。还有什么原因?