You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何修复Linux(Termux)中psutil导入的Permission Denied错误

解决Termux中psutil模块初始化的Permission Denied错误

嘿,我懂你的困扰——那些不影响功能但看着闹心的权限报错确实烦人!咱们来一步步搞定它。

问题根源

你遇到的PermissionError并不是来自你写的代码逻辑,而是psutil模块在导入后的初始化阶段触发的。psutil导入完成后,会自动尝试读取/proc/stat文件获取CPU统计信息,但Termux的沙箱环境可能限制了这个文件的访问权限。

你原来的try-except只包裹了import语句,但psutil的初始化代码是在导入完成后才执行的(比如设置全局的CPU时间变量),所以这些异常根本没被你的捕获逻辑覆盖。

解决方案

根据你的需求(给自己的进程发送SIGTERM),有两种简单的解决方式:

方案一:完全绕过psutil(推荐)

其实你根本不需要psutil就能实现发送信号的功能,直接用Python内置的signal模块就行,这样彻底避免psutil的初始化问题:

import os, signal

print("killing python")
# 直接向当前进程发送SIGTERM信号
signal.raise_signal(signal.SIGTERM)

方案二:保留psutil但捕获初始化错误

如果你因为其他需求必须用psutil,可以修改导入逻辑,主动触发并捕获它的初始化错误:

import os, signal

# 延迟导入psutil并处理初始化时的权限错误
try:
    import psutil
    # 手动触发psutil的初始化操作,捕获权限错误
    try:
        psutil.cpu_times()
    except PermissionError:
        # 忽略这个不影响功能的错误
        pass
except Exception:
    # 导入失败时的 fallback(可选)
    pass

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

效果说明

两种方案都能让你的脚本正常运行,同时不再输出那些冗余的Permission Denied错误信息。方案一更轻量,不需要依赖psutil;方案二则保留了psutil的使用,适合你后续可能扩展功能的场景。

内容的提问来源于stack exchange,提问作者Mr. lindroid

火山引擎 最新活动