从Python更新proc条目的推荐方法是什么
我在从Python更新proc条目的推荐方法是什么,python,linux,linux-kernel,linux-device-driver,Python,Linux,Linux Kernel,Linux Device Driver,我在/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 我有一个用Python2.7编写的守护进程,它将查找一些外部事件触发器,当该事件触发时,应该在内
/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
我有一个用Python2.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
模块。它的函数open
、write
和close
几乎都是C对应函数的直接包装
更像C意味着更少的惊喜 Linux将/proc文件系统公开为文件,顾名思义。这意味着您将像处理任何其他文件一样处理这些文件。关于如何访问/proc,您建议的函数基本上是完美的,但建议绝对有效。您的代码有几个问题 首先,您想写入该文件,但要以读取模式打开它 其次,
.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
,请将打印
行更改为:
p.write(str(int(enable)) + '\n')
有一种方法可以一步完成从布尔值到字符串的转换:使用布尔值索引到字符串文字:
'01'[enable]
它很短而且很快,但有些人会认为使用布尔函数作为索引有点神秘。我将从中生成两个函数:
def enable():…
和def disable():…
@JonasGröger我同意这应该是两个函数,但这并不是问题的重点。代码块是一个简单的例子,展示了我想要实现的目标。这就是为什么这是一个注释而不是答案:)我不同意。文档清楚地说明:不要直接导入这个模块。@JonasGröger:哦,好的。建议使用具有相同功能的os
。更新了,我还是不明白你为什么要这么做that@hek2mgl:因为OP正在与内核模块交互。每个系统调用都可能从内核模块中看到,因此python包装器越薄越好。使用builtins.open()
您不知道有多少系统调用,也不知道使用了哪些参数,但是使用os.open()
您知道这一点。/proc中的文件就是一个文件。就这样。您建议在使用Python处理文件时始终这样做,或者在这里没有意义,因为/proc中的文件只是一个文件。进一步注意,如果您在Linux上使用文件,您将始终与内核模块通信。这不是什么特别的事。有一些userland文件系统实现,但即使是那些实现也依赖于内核。Linux上的常见文件系统(如ext、btrfs)都是作为内核模块实现的。