【问题标题】:How to fix psutil import error "permission denied" on linux?如何在 Linux 上修复 psutil 导入错误“权限被拒绝”?
【发布时间】:2020-06-29 14:18:33
【问题描述】:

我正在尝试为 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

【问题讨论】:

  • 你是在安卓上执行这个吗?
  • @KamilCuk 是的兄弟。
  • 如果你有sudo访问权限,试试sudo chmod 444 /proc/stat
  • @Philippe 我的手机没有 root 访问权限。
  • @Philippe 我已经尝试过这样做。但是在原始代码上,我使用了 concurrent.future 。所以我找不到其他方法来停止线程池。当我尝试 os.kill 时,它卡了很长时间。

标签: android python-3.x try-except psutil termux


【解决方案1】:

今天我在 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 类来处理错误,但它没有用。还有什么原因?

【讨论】:

  • 我认为子类/函数引起的多次加薪,它们破坏了主类/函数。所以主类/函数也引发了异常。而且我不知道如何处理这些错误。你不能用简单的“try”、“except”来捕获多个异常。当我遇到此错误时,我至少搜索了 2-3 小时以寻找带有“try”、“except”的解决方案。但是没有找到。
【解决方案2】:

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

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 存在真正的问题(即缺少依赖模块)。

【讨论】:

    猜你喜欢
    • 2015-02-02
    • 2021-11-24
    • 2018-07-28
    • 1970-01-01
    • 2019-03-15
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    相关资源
    最近更新 更多