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

What is the recommended way to update a proc entry from Python

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

在 bash 中,要启用该模式,我只需执行

echo 1 > /proc/sys/fs/offs/ts/enable

要禁用它,

echo 0 > /proc/sys/fs/offs/ts/enable

我有一个用 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()

因为它是低级代码,不打算移植,我会使用 os 模块。它的函数 openwriteclose 几乎是 C 对应函数的直接包装。

越像 C 就意味着越不惊喜!

Linux 公开 /proc 文件系统,如名称所示,files。这意味着您将像处理任何其他文件一样处理这些文件。关于如何访问 /proc,您建议的功能基本上是完美的,但是 建议绝对有效。

您的代码有几个问题。

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

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

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

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

如果你想用 .write 来做,请将 print 行更改为:

p.write(str(int(enable)) + '\n')

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

'01'[enable]

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