我编写了一个小型 Autokey 脚本,用于通过某个 URL 全屏启动 Firefox。这个脚本已经运行了好几年。自从系统升级以来,它开始产生一个 Python 错误,这似乎与我的代码无关。尽管出现了错误,但脚本仍然按我的预期运行,即启动一个新的 Firefox 窗口,打开 URL 并最大化窗口。
系统详细信息:
- Linux Mint 20.1 Cinnamon
- autokey-gtk 0.95.10
- Python 3.8.5
脚本已删除注释并编辑部分细节,但保留了行号:
9 system.exec_command("firejail firefox -new-window URL”)
11 time.sleep(1)
12 system.exec_command("wmctrl -r \"Title\" -b add,maximized_vert,maximized_horz")
错误是:
Traceback (most recent call last):
File “/usr/lib/python3/dist-packages/autokey/service.py”, line 485, in execute
exec(script,code,scope)
File “<string>”,line 12,in <module>
File /usr/lib/python3/dist-packages/autokey/scripting.py”, line 497, in exec_command
if output[-1]==”\n”:
IndexError: string index out of range
可以看出,我的代码中没有数组。我不是 Python 程序员,我不知道该怎么做才能更正对 的引用output[-1]
。
任何帮助,将不胜感激。
编辑-添加 scripting.py 摘录
以下是实际引发异常的代码。第 497 行是
if output[-1] ...
。
这是拼写错误还是 -1 的索引在 Python 中具有特殊含义(字符串的最后一个字符?)?
def exec_command(self, command, getOutput=True):
"""
Execute a shell command
Usage: C{system.exec_command(command, getOutput=True)}
Set getOutput to False if the command does not exit and return immediately. Otherwise
AutoKey will not respond to any hotkeys/abbreviations etc until the process started
by the command exits.
@param command: command to be executed (including any arguments) - e.g. "ls -l"
@param getOutput: whether to capture the (stdout) output of the command
@raise subprocess.CalledProcessError: if the command returns a non-zero exit code
"""
if getOutput:
with subprocess.Popen(
command,
shell=True,
bufsize=-1,
stdout=subprocess.PIPE,
universal_newlines=True) as p:
output = p.communicate()[0]
if output[-1] == "\n":
# Most shell output has a new line at the end, which we
# don't want. Drop the trailing newline character
output = output[:-1]
if p.returncode:
raise subprocess.CalledProcessError(p.returncode, output)
return output
else:
subprocess.Popen(command, shell=True, bufsize=-1)
答案1
也许我应该在 Stack Overflow 上发布这个问题,我可能会从 Python 程序员那里得到答案。
我在 git 上找到了文件 scripting.py,发现该行已被更改。我不明白我怎么会安装旧版本,应用程序版本是最新版本。git blame 指出这是该文件中唯一的更改。
修改第 497 行修复了我的错误。从
if output[-1]==”\n”:
到
if output.endswith("\n"):