如何修复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




