使用 Python 正确执行系统命令

在 Linux 系统中,有时需要使用 Python 来访问系统命令并将其集成到脚本中。在我们的示例中,我们有一个脚本 dzresize.py,它用于动态调整 dzen2 的输出大小,当 i3 工作空间小于或等于 3 个时,它会使用 conky 输出扩大 dzen2 的大小;当工作空间大于或等于 3 个时,它会使用较小的 dzen2 输出。但是在执行该脚本时遇到了问题,无法正确调用系统命令。

解决方案

  1. 安装必要的依赖项

    在使用脚本之前,需要确保已经安装了必要的依赖项,包括 i3、dzen2 和 conky。请按照相应的发行版的说明进行安装。

  2. 修改脚本中的命令

    脚本中使用 subprocess 模块来调用系统命令,但是我们发现缺少了一个必要的参数,导致命令无法正常执行。需要在 subprocess.check_output() 函数中添加一个逗号,将命令参数列表变为一个元组。

    subprocess.check_output(["i3-msg", "-t", "get_workspaces"])
    

    修改为:

    subprocess.check_output((["i3-msg", "-t", "get_workspaces"]))
    
  3. 修复脚本中的判断条件

    在脚本中,我们使用 len(status_list) <= 3 来判断是否需要扩大 dzen2 的大小。但是,在实际运行中,我们发现应该使用 len(status_list) < 3 来进行判断。因为当工作空间数目为 3 时,我们也需要扩大 dzen2 的大小。

    if len(status_list) <= 3:
    

    修改为:

    if len(status_list) < 3:
    
  4. 创建新的脚本来处理 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"])
    
  5. 调整脚本中的命令输出

    我们在脚本中使用 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()

希望这些修改能够帮助你解决脚本中遇到的问题并使其正常工作。

  • 17
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值