在 Linux 系统中,有时需要使用 Python 来访问系统命令并将其集成到脚本中。在我们的示例中,我们有一个脚本 dzresize.py,它用于动态调整 dzen2 的输出大小,当 i3 工作空间小于或等于 3 个时,它会使用 conky 输出扩大 dzen2 的大小;当工作空间大于或等于 3 个时,它会使用较小的 dzen2 输出。但是在执行该脚本时遇到了问题,无法正确调用系统命令。
解决方案
-
安装必要的依赖项
在使用脚本之前,需要确保已经安装了必要的依赖项,包括 i3、dzen2 和 conky。请按照相应的发行版的说明进行安装。
-
修改脚本中的命令
脚本中使用 subprocess 模块来调用系统命令,但是我们发现缺少了一个必要的参数,导致命令无法正常执行。需要在 subprocess.check_output() 函数中添加一个逗号,将命令参数列表变为一个元组。
subprocess.check_output(["i3-msg", "-t", "get_workspaces"])
修改为:
subprocess.check_output((["i3-msg", "-t", "get_workspaces"]))
-
修复脚本中的判断条件
在脚本中,我们使用 len(status_list) <= 3 来判断是否需要扩大 dzen2 的大小。但是,在实际运行中,我们发现应该使用 len(status_list) < 3 来进行判断。因为当工作空间数目为 3 时,我们也需要扩大 dzen2 的大小。
if len(status_list) <= 3:
修改为:
if len(status_list) < 3:
-
创建新的脚本来处理 3 个工作空间的情况
为了更好地处理脚本中对 dzen2 大小调整的逻辑,我们创建了一个新的脚本 dzconky_for_3_workspaces.sh,专门用于处理 3 个工作空间的情况。
#!/bin/sh exec conky -d -c "$HOME/bin/conkyrc_cli" | dzen2 -fg "#666666" -bg "#333333" -ta left -w 725 -x 54 -y 750 & exit 0
在 dzresize.py 脚本中,当判断工作空间数目为 3 时,我们调用这个新的脚本来调整 dzen2 的大小。
if len(status_list) < 3: subprocess.check_output(["dzconky_for_3_workspaces.sh"]) else: subprocess.check_output(["dzconky.sh"])
-
调整脚本中的命令输出
我们在脚本中使用 subprocess.check_output() 函数来执行系统命令,并且将命令的输出作为变量来使用。但是,在脚本中我们没有对输出进行任何处理,导致命令的输出直接显示在终端上。为了防止这种情况,我们需要将命令的输出重定向到一个变量中。
status = subprocess.check_output((["i3-msg", "-t", "get_workspaces"]))
修改为:
status = subprocess.check_output((["i3-msg", "-t", "get_workspaces"])).decode("utf-8")
这样,我们就将命令的输出存储在一个变量 status 中,并且可以进一步处理它。
代码例子
以下是完整的 dzresize.py 脚本,包含了以上所有的修改:
import subprocess
def main():
# 获取 i3 的工作空间数目
status = subprocess.check_output((["i3-msg", "-t", "get_workspaces"])).decode("utf-8")
# 将 status 转换为列表
status_list = list(status)
# 计算工作空间的数目
name = 0
for i in status_list:
if i == "name":
name += 1
# 判断工作空间数目并调整 dzen2 的大小
if len(status_list) < 3:
subprocess.check_output(["dzconky_for_3_workspaces.sh"])
else:
subprocess.check_output(["dzconky.sh"])
main()
希望这些修改能够帮助你解决脚本中遇到的问题并使其正常工作。