我正在使用 Ubuntu 20.10 和 python 2.7。我有一个 bash 脚本,它会覆盖默认的键盘绑定,当我从终端执行它时它总是有效,这是脚本。
#!/bin/bash
xkbcomp -w0 -I$HOME/.xkb $HOME/.xkb/keymap/mykbd $DISPLAY
我还将它添加到我的.bashrc
文件中,以便当我打开新终端时它始终执行。问题是我有一个站立式办公桌,有时当我调整高度时,键盘会断开连接并再次连接,我必须再次打开一个新终端,以便再次应用我的自定义按键绑定。
我想出的最好的解决方案是创建一个 systemd python 作业,当插入键盘时它将执行 bash 脚本。当我单独运行 python 脚本时,它很少起作用,我可以在 syslog 中看到 python 脚本当键盘断开连接并再次连接并且键绑定被覆盖但新的键绑定不起作用时,调用 bash 脚本。这是Python脚本
#!/usr/bin/python
import functools
import os.path
import pyudev
import subprocess
def main():
BASE_PATH = os.path.abspath(os.path.dirname(__file__))
path = functools.partial(os.path.join, BASE_PATH)
call = lambda x, *args: subprocess.call([path(x)] + list(args))
context = pyudev.Context()
monitor = pyudev.Monitor.from_netlink(context)
monitor.filter_by(subsystem='usb')
monitor.start()
for device in iter(monitor.poll, None):
name = 'Freestyle_Edge_Keyboard'
if device.get('ID_MODEL') == name:
subprocess.call(['sh', '/home/user/scripts/loadKeyboardOverwrites.sh'])
if __name__ == '__main__':
main()
当我启动 systemd 作业时,我可以在 syslog 中看到密钥被覆盖,但它不起作用,并且 syslog 中我发现有点可疑的唯一内容是有关的消息xkb_variant & xkb_options requires a string value
和有关的错误myswap
Mar 24 21:33:32 user callShOnKeyboardPlugin.py[1533582]: Error: Can't find file "myswap" for symbols include
Mar 24 21:33:32 user callShOnKeyboardPlugin.py[1533582]: Exiting
Mar 24 21:33:32 user callShOnKeyboardPlugin.py[1533582]: Abandoning symbols file "(null)"
Mar 24 21:17:01 user /usr/libexec/gdm-x-session[28481]: (**) Option "xkb_model" "pc105"
Mar 24 21:17:01 user /usr/libexec/gdm-x-session[28481]: (**) Option "xkb_layout" "sk"
Mar 24 21:17:01 user /usr/libexec/gdm-x-session[28481]: (WW) Option "xkb_variant" requires a string value
Mar 24 21:17:01 user /usr/libexec/gdm-x-session[28481]: (WW) Option "xkb_options" requires a string value
myswap 文件位于 ~/.xkb/symbols/myswap
这是 systemd 的工作
[Unit]
Description=desc
[Service]
ExecStart=/home/user/scripts/callShOnKeyboardPlugin.py
Restart=always
Environment="PYTHONPATH=$PYTHONPATH:/home/user/.local/lib/python2.7/site-packages"
[Install]
WantedBy=multi-user.target
有谁知道问题可能出在哪里吗?或者还有其他更好的方法来做到这一点吗?任何帮助将不胜感激。
如果缺少什么,请告诉我,我会提供。
更新
我用不同的方式处理它。我已将其设置为启动脚本,并且在检测到键盘后添加了一些延迟,这使其能够一致地工作。
答案1
我猜你需要设置一下WorkingDirectory = /home/user
。您确定$DISPLAY
设置正确吗?可能值得尝试从设备中转储您的环境并将其与常规 shell 环境进行比较。