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)
您的代码存在一些问题。
首先,您想要写入文件,但以读取模式打开它。
其次,.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)
它简短而快速,但有些人会认为使用布尔值作为索引有点神秘。