Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Python更新proc条目的推荐方法是什么_Python_Linux_Linux Kernel_Linux Device Driver - Fatal编程技术网

从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)都是作为内核模块实现的。