如何使用 Python 获取 unix 域套接字的路径

How to get the path of a unix domain socket using Python

所以,我正在为一个项目使用 podman-py 库。为了使用它,我需要为 libpod 服务提供一个 URI 路径。此 URI 具有以下形式:

"unix:///run/user/<some-id>/podman/podman.sock"

目前,我在安装 podman-remote:

后通过 运行 我的服务器上的这个命令得到这个 URI

systemctl --user status podman.socket

然后我得到以下输出,从中我得到了 podman.sock 的路径:

● podman.socket - Podman API Socket
   Loaded: loaded (/usr/lib/systemd/user/podman.socket; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:podman-system-service(1)
   Listen: /run/user/0/podman/podman.sock (Stream)

现在我已经在我的代码中硬编码了这个 URI。然而,更多的人会使用这个项目,我想动态获取路径,以防它因服务器而异。我当然可以只执行命令并使用 Python grep 我想要的内容,但我想知道在使用此解决方案之前是否有更好的选择。

谢谢!

理想情况下,您可以导入一个 systemctl 模块,无需花钱就能做到这一点。

您需要的信息是 'show' 命令输出中的 Listen 元素:

$ systemctl --user show pulseaudio.socket|grep -i listen
Listen=/run/user/101346/pulse/native (Stream)

获取此信息的 quick-n-dirty 黑客可能如下所示:

import subprocess
args=["/usr/bin/systemctl", "--user", "show", "pulseaudio.socket"]
command = subprocess.Popen(args, stdout=subprocess.PIPE,
                           stderr=subprocess.PIPE)
stdout, stderr = command.communicate()
lines = stdout.splitlines()
listen = [str(l) for l in allstatus if l.startswith(b'Listen') ]
mysocket = listen[0].split("=")[1].split(" ")[0]

这将表明我的用户 ID 具有 pulseaudio 套接字:

>>> mysocket
'/run/user/101346/pulse/native'