MacOS下Python用subprocess调用sysctl触发FileNotFoundError求助
解决MacOS中Python subprocess调用sysctl出现FileNotFoundError的问题
问题根源
你错误地将包含参数的完整命令字符串直接传给了subprocess,而没有按要求拆分。当使用subprocess默认的shell=False时,它会把整个字符串当作单个可执行文件的路径去查找——显然不存在'/usr/sbin/sysctl -n machdep.cpu.brand_string'这个文件,实际可执行文件是/usr/sbin/sysctl,后面的都是参数。
root身份能运行只是环境或调用方式的偶然差异,核心问题还是参数传递错误。
正确调用方式
有两种可靠的写法:
方式1:拆分命令为列表(推荐,更安全)
import subprocess # 将命令和参数拆分为独立的列表元素 result = subprocess.run( ['/usr/sbin/sysctl', '-n', 'machdep.cpu.brand_string'], capture_output=True, text=True ) print(result.stdout.strip())
方式2:开启shell=True(适合简单场景,注意安全风险)
如果不想拆分参数,可以开启shell模式,让系统shell来解析整个命令:
import subprocess result = subprocess.run( '/usr/sbin/sysctl -n machdep.cpu.brand_string', shell=True, capture_output=True, text=True ) print(result.stdout.strip())
关于权限无法修改的说明
你无法用sudo修改/usr/sbin/sysctl的权限,是因为MacOS的**系统完整性保护(SIP)**机制。该机制锁定了系统核心目录与文件,禁止任何用户(包括root)修改,以此保障系统安全稳定。/usr/sbin属于SIP保护范围,所以出现Operation not permitted是正常的,无需也不应关闭SIP来修改该文件。
内容的提问来源于stack exchange,提问作者luke
相关产品推荐
相关产品推荐

