如何修复 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 来处理错误,但它没有用。还有什么原因?
我正在尝试为 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 来处理错误,但它没有用。还有什么原因?