この質問や少なくとも同様の質問をする前に、私はかなりの自信を持っています。私の問題は少し問題ですが、それは簡単です。起動時にPythonスクリプトを実行して、Linuxでマウスとキーボードの動作を記録する
起動時にcron
でPythonスクリプトを実行しようとしましたが、Linuxでetc/rc.localファイルを編集しましたが、両方の方法でPythonスクリプトを実行できませんでした。
スクリプトは、キーボードとマウスの両方のリスナーオブジェクトを使用して、キーボードとマウスの動作を記録します。私はXlib
に依存するpynput
と呼ばれるサードパーティのパッケージを使用しています。私のスクリプトはsudo
が必要なファイルを編集するので、スクリプトをsudo
で実行する必要があります。あなたが知っているので、スクリプトを見て持っている必要があり
:このスクリプトは、キーボードとマウスの活動を記録します
#!/usr/bin/env python
#backlight.py
from pynput.keyboard import Listener as KeyboardListener
from pynput.mouse import Listener as MouseListener
import time
STATUS = "" # Keyboard backlight ON/OFF status
turnOffSecs = 6 # Turn off keyboard backlight for x seconds of inactivity
# Keyboard brightness control file (change to your directory)
file_pth = "/sys/devices/platform/asus-nb-wmi/leds/asus::kbd_backlight/brightness"
def get_LEVEL():
"""return the current level of brightness of keyboard backlight"""
with open(file_pth, "r") as f:
brightness_level = f.read()[0]
return brightness_level
class Sec_timer:
"""
Sec_timer(until=None)
Create a timer that counts x number of seconds starting from 0
until arg can be used for reseting the timer:
*Example:
timer = Sec_imer(20)
while timer.elapsed < timer.until:
timer.count() # count a second
else:
timer.reset_timer() # reset timer on exit
"""
def __init__(self, until=None):
self.until = until
self.elapsed = 0
def count_sec(self):
"Count one second per-call"
time.sleep(1)
self.elapsed += 1
def reset_timer(self):
self.elapsed = 0
timer = Sec_timer(turnOffSecs) # Sec_timer(x) turn off keyboard backlight for x seconds of inactivity
# General event handler to reset timer
def reset_timer(*args):
global STATUS
timer.reset_timer()
if STATUS == "OFF":
# print(STATUS)
with open(file_pth, "w") as f:
f.write(current_brightnessLevel)
f.close()
STATUS="ON"
keyboard_listener = KeyboardListener(on_press=reset_timer,
on_release=(lambda *args: None))
mouse_listener = MouseListener(on_click=reset_timer,
on_scroll=reset_timer,
on_move=reset_timer)
keyboard_listener.start()
mouse_listener.start()
while True:
timer.count_sec()
if timer.elapsed > timer.until:
# print "current brightness:" + get_LEVEL()
if get_LEVEL() != "0":
with open(file_pth, "w") as f:
current_brightnessLevel = get_LEVEL()
f.write("0")
STATUS = "OFF"
は、任意のキーボードまたはマウスの活動は、タイマーをリセットします。 x秒が経過し、キーボードやマウス操作が行われていない場合は、輝度フォルダに "0"を書き込んでキーボードのバックライトを消してください。マウスまたはキーボードイベントが発生した場合after
スクリプトをオフにすると、バックライトはバックライトの以前の輝度レベルに従ってキーボードの明るさをオンにします。
ターミナルを使用してスクリプトを実行すると、正常に動作します。しかし、このスクリプトの起動を自動化するのは難しい作業です。ここで私がこれまで試したものです:
*注、私が作ったスクリプトファイルを実行可能とbacklight.pyは/home/user
に常駐:
1):
$ xhost +
$ sudo ./backlight.py
作品罰金は!など `使用
2)/ rc.localに私が追加:
xhost +
cd /home/user/
./backlight.py
スクリプトの再起動後に実行されなかった
使用3)etc/rc.local
$ sudo crontab -e
@reboot xhost +
@reboot /home/user/backlight.py
再起動後に実行しなかった
Xlib
の問題のため、xhost +
を実行しなければなりませんでした。最後の2つの方法を使用しても機能しませんでした。私はこれがプログラミング上の問題だと推測しています。おそらくそれはXlib
と何か関係がありますか?
私はこのスクリプトがキーボードLEDとのインタフェースに関しては非常識であると知っています。あなたが望むなら、それは「悪いスクリプト」と呼んでいます。私はLinuxドライバの詳細を掘り下げようとしているのではないので、ファイル入出力ソリューションを使ってドライバの問題を解決しようとしていますが、少なくとも今はありません!
私はいくつかの努力の結果、スクリプトに 'pynput'やその依存関係' Xlib'のバグがあることを知りました。 – direprobs