从 Python 更新 proc 条目的推荐方法是什么

Ant*_*eri 3 python linux linux-device-driver linux-kernel

我有一个 linux proc 条目,其中/proc/sys/fs/offs/ts/enable切换自定义内核模块中的标志。将值设置为 1 将启用模块中的一种模式,设置为 0 将禁用该模式。

在 bash 中,要启用该模式,我只需这样做

echo 1 > /proc/sys/fs/offs/ts/enable
Run Code Online (Sandbox Code Playgroud)

要禁用它,

echo 0 > /proc/sys/fs/offs/ts/enable
Run Code Online (Sandbox Code Playgroud)

我有一个用 Python 2.7 编写的守护进程,它将查找一些外部事件触发器,当该事件触发时,应该启用或禁用内核模块中的功能。该守护进程以 root 权限运行,因此我不应该遇到任何类型的权限问题。

有没有推荐的方法从 python 设置这个值?

例如,假设我的函数现在看起来像这样。

def set_mode(enable=True):
    with open('/proc/sys/fs/offs/ts/enable', 'w') as p:
        if enable:
            p.write("1")
        else:
            p.write("0")
        p.flush()
Run Code Online (Sandbox Code Playgroud)

PM *_*ing 5

您的代码存在一些问题。

首先,您想要写入文件,但以读取模式打开它。

其次,.write需要字符串数据,而不是整数。

我们可以利用和分别具有整数值 0 和 1 的if事实来摆脱测试。下面的代码使用函数而不是因为可以将返回的整数转换为字符串。另外,附加一个换行符(除非您通过参数告诉它不要这样做),这样 Python 代码就会执行与 Bash 命令行相同的操作。FalseTrueprint.writeprintint(enable)printend

def set_mode(enable=True):
    with open('/proc/sys/fs/offs/ts/enable', 'w') as p:
        print(int(enable), file=p)
Run Code Online (Sandbox Code Playgroud)

如果您想使用 来执行此操作.write,请将行更改print为:

p.write(str(int(enable)) + '\n')
Run Code Online (Sandbox Code Playgroud)

有一种方法可以一步完成从布尔值到字符串的转换:使用布尔值索引到字符串文字:

'01'[enable]
Run Code Online (Sandbox Code Playgroud)

它简短而快速,但有些人会认为使用布尔值作为索引有点神秘。