- 上下文
- 问题
- 附加信息
上下文
我知道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
输出?data
type
附加信息
您可能认为这没什么大不了的。但是,对于更复杂的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"])