2016-11-18 5 views
3

私は/proc/sys/fs/offs/ts/enableのlinux procエントリを持っており、カスタムカーネルモジュールのフラグをトグルします。値を1に設定するとモジュール内のモードが有効になり、0に設定するとそのモードが無効になります。 bashでPythonからprocエントリを更新するための推奨方法はありません

、モードを有効にするために、私は単に

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

コードにはいくつか問題があります。

まず、ファイルに書き込みたいが、読み込みモードで開く。

第2に、.writeには、整数ではなく文字列データが必要です。

FalseTrueの整数値がそれぞれ&1であることを利用して、ifのテストを取り除くことができます。 ではなくprint関数を使用します。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モジュールを使用します。それは、Cの対応するもののほぼ直接のラッパーである機能open,writeおよびcloseを有する。

さらにCのほうが驚きが少ない!

+1

私は同意しません。ドキュメントには、次のことが明確に記載されています。**このモジュールを直接インポートしないでください。** –

+0

@ JonasGroger:Oh、ok。お勧めは、同じ機能を持つ 'os'を使うことです。更新しました。 – rodrigo

+1

私はまだあなたがそれをする理由を理解していません – hek2mgl

1

Linuxは、/ procファイルシステムを、名前の通り、というファイルとして公開します。つまり、他のファイルと同じようにファイルを操作します。あなたの提案された機能は、基本的に/ procへのアクセス方法に関して完璧ですが、PM 2Ring'sの推奨事項は間違いありません。

関連する問題