上下文

上下文
  • 上下文
  • 问题
  • 附加信息

上下文

我知道busctl可以用来获取 Zathura 实例中当前文档的页数。

busctl --user get-property org.pwmt.zathura.PID-17525 /org/pwmt/zathura org.pwmt.zathura pagenumber
u 187

如上所示,输出包括 ,u表示type返回值的 。u可以type使用 来证明--json=pretty

busctl --json=pretty --user get-property org.pwmt.zathura.PID-17525 /org/pwmt/zathura org.pwmt.zathura pagenumber
{
    "type" : "u",
    "data" : 187
}

我不需要知道type返回值的 ,我只想得到data。我知道可以使用一些外部工具来摆脱type。例如:

busctl --user get-property org.pwmt.zathura.PID-17525 /org/pwmt/zathura org.pwmt.zathura pagenumber | cut -d ' ' -f 2
187
busctl --json=short --user get-property org.pwmt.zathura.PID-17525 /org/pwmt/zathura org.pwmt.zathura pagenumber | jq -r '.data'
187

问题

为了减少我编写的程序的计算复杂性并避免重复执行任务,我将此视为一个原则:程序不应提取程序输出的数据,而应以所需的格式输出数据。所以,我的问题是:如何在不包含的情况下进行busctl输出?datatype

附加信息

您可能认为这没什么大不了的。但是,对于更复杂的data,隐藏type变得更加困难:

busctl --user get-property org.pwmt.zathura.PID-17525 /org/pwmt/zathura org.pwmt.zathura documentinfo
s "{\n  \"filename\" : \"/home/rdrg/my/calibre/Unknown/Unknown (348)/Unknown - Unknown.pdf\",\n  \"number-of-pages\" : 187,\n  \"index\" : []\n}"

下面删除了type,但是字符串已被转义,现在我需要处理所有字符串以取消转义。

busctl --user get-property org.pwmt.zathura.PID-17525 /org/pwmt/zathura org.pwmt.zathura documentinfo | cut -d ' ' -f 2-
"{\n  \"filename\" : \"/home/rdrg/my/calibre/Unknown/Unknown (348)/Unknown - Unknown.pdf\",\n  \"number-of-pages\" : 187,\n  \"index\" : []\n}"

下面得到了type,但我们需要使用一个jq解析器,它可能需要大量的计算复杂性。

busctl --json=short --user get-property org.pwmt.zathura.PID-17525 /org/pwmt/zathura org.pwmt.zathura documentinfo | jq -r '.data'
{
  "filename" : "/home/rdrg/my/calibre/Unknown/Unknown (348)/Unknown - Unknown.pdf",
  "number-of-pages" : 187,
  "index" : []
}

答案1

如何使 busctl 输出数据而不包括类型?

你不需要。它无条件地输出消息类型,并且没有任何隐藏选项可以跳过其代码的该部分。

                } else {

                        fputs(sd_bus_message_get_signature(reply, true), stdout);
                        fputc(' ', stdout);

                        r = format_cmdline(reply, stdout, false);
                        if (r < 0)
                                return bus_log_parse_error(r);

                        fputc('\n', stdout);
                }

为了减少我编写的程序的计算复杂性并避免执行重复任务,我将此视为一条原则:程序不应提取程序输出的数据,而应以所需的格式输出数据。

因此,您不应该使用通用工具来输出所需的格式,而应该编写一个直接执行所需任务的专用工具。

如果你已经编写程序时,您应该在该程序中直接使用 D-Bus,而不是调用busctl或其他 shell 工具。

#!/usr/bin/python3
import argparse
import dbus
# import json

parser = argparse.ArgumentParser()
parser.add_argument("pid")
args = parser.parse_args()

bus = dbus.SessionBus()
obj = bus.get_object("org.pwmt.zathura.PID-%s" % args.pid,
                     "/org/pwmt/zathura")
obj_prop = dbus.Interface(obj, "org.freedesktop.DBus.Properties")

res = obj_prop.Get("org.pwmt.zathura", "pagenumber")
print(res)

# res = obj_prop.Get("org.pwmt.zathura", "documentinfo")
# res = json.loads(res)
# print(res["number-of-pages"])

相关内容