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

3

我有一个位于/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()

1
我会将其拆分为两个函数:def enable(): ...def disable(): ... - Jonas Gröger
@JonasGröger 我同意这应该是两个函数,但这并不是问题的重点。 代码块只是一个简单的示例,展示了我想要实现的内容。 - Anthony Oteri
这就是为什么这是一条注释而不是答案的原因 :) - Jonas Gröger
3个回答

5
您的代码存在一些问题。首先,您希望写入文件,但是却以只读模式打开了它。其次,.write 希望接收字符串数据,而不是整数。
我们可以通过利用 False 和 True 的整数值分别为 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]

这段代码短小快速,但有些人会认为使用布尔值作为索引有些晦涩难懂。


1
Linux公开了/proc文件系统,就像名称所示,作为文件。这意味着您将像处理任何其他文件一样处理这些文件。关于如何访问/proc,您建议的函数基本上是完美的,但PM 2Ring's的建议绝对是有效的。

-1

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

更像C等于更少的惊喜!


1
我不同意。文档明确指出:不要直接导入此模块 - Jonas Gröger
1
我仍然不明白为什么你要这样做。 - hek2mgl
因为 OP 正在与内核模块交互。每个系统调用都可能从内核模块中看到,因此 Python 包装器越薄,越好。使用 builtins.open(),您不知道有多少系统调用,或者确切使用了哪些参数,但是使用 os.open(),您就知道了。 - rodrigo
1
/proc 中的文件就是一个文件。这就是它的全部。无论你在 Python 中使用文件时是否建议这样做,因为 /proc 中的文件只是一个文件,所以这并没有意义。此外,请注意,如果您在 Linux 上使用文件,则始终会与内核模块通信。这并不是什么特别的事情。有一些用户空间文件系统实现,但即使这些文件系统也依赖于内核。Linux 上常见的文件系统,如 ext、btrfs 都是作为内核模块实现的。 - hek2mgl
1
我的担忧的一部分,也是这个回答相关的原因,是/proc中的一些文件与系统上的其他文件的行为不同。例如,如果您尝试对/proc中的某些文件进行状态(stat)操作,它们将返回0大小,即使cat文件会显示输出内容。当我提出问题时,我不确定是否使用内置的“open”调用将尝试在打开文件句柄之前执行“stat”文件的操作。如果是这样的话,它可能无法正常工作,因为“stat”无法按预期方式工作。 - Anthony Oteri
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接