2016-11-18 6 views
3

У меня есть запись в linux proc в /proc/sys/fs/offs/ts/enable, которая переключает флаг в пользовательский модуль ядра. Установка значения в 1 позволит включить режим в модуле, установка в 0 отключит этот режим.Каков рекомендуемый способ обновления записи proc из Python

В Баш, чтобы включить режим, я бы просто сделать

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(): ...' –

+0

@ JonasGröger Я согласен, что это должно быть 2 функции, но это не так точка вопроса. Блок кода был простым примером, показывающим, что я хочу выполнить. –

+0

Вот почему это комментарий, а не ответ :) –

ответ

4

Есть пара проблем с вашим кодом.

Во-первых, вы хотите записать файл, но вы открываете его в режиме чтения.

Во-вторых, .write ожидает строковые данные, а не целое число.

Мы можем избавиться от теста if, используя тот факт, что False и True имеют целые значения 0 & 1, соответственно. В приведенном ниже коде используется функция 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] 

это короткое & быстро, но некоторые утверждают, что это немного загадочное использовать булевы как Indice s.

-1

Поскольку это код низкого уровня, не предназначен, чтобы быть портативными, я хотел бы использовать os модуль. Он имеет функции open, write и close, которые являются почти прямыми оберткими экземпляров C.

Больше, чем C, меньше сюрпризов!

+1

Я не согласен. В документации четко указано: ** Не импортируйте этот модуль напрямую. ** –

+0

@ JonasGröger: О, хорошо. Рекомендация заключается в использовании 'os', который имеет те же функции. Обновлено. – rodrigo

+1

Я все еще не понимаю, зачем вы это делаете – hek2mgl

1

Linux предоставляет файловую систему/proc, как указано в названии, как файлов. Это означает, что вы будете работать с такими файлами, как с любым другим файлом. Ваша предлагаемая функция в основном идеальна в отношении доступа/proc, но рекомендации PM 2Ring's определенно действительны.