通过 Python3 在 Linux 中关闭屏幕

Turn screen off in Linux via Python3

我正在尝试实现一个 python3 文件来关闭计算机屏幕 detailed here,命令:

xset -display :0.0 dpms force off

输入终端确实有效,它会关闭屏幕,甚至不需要其他命令来重新打开它,因为任何按键都会打开它。

现在如何将它实现到 python,尤其是 subprocess,因为我听说 os 模块使用起来不是很安全。

我试过了

import subprocess

subprocess.run(["xset","-display :0.0 dpms force off"])

但是它不起作用,它给我一个错误。请帮忙,并告诉我像这样 运行 是否安全,或者是否有其他解决方案可以从 python.

做到这一点

要事第一:在以后的问题中,不要只说"it doesn't work, it gives me an error"。向我们准确显示错误消息是什么。

我猜你收到的消息是这样的:

xset: unknown option -display :0.0 dpms force off

usage: xset [-display host:dpy] option ...

后跟一长串 xset 将接受的选项。

发生这种情况是因为您的 subprocess.run 参数列表将所有 xset 命令参数都塞进了列表中的单个项目。这相当于 运行 在终端中执行此命令:

xset "-display :0.0 dpms force off"

其中引号会导致所有参数词被分组为一个 xset 不理解的大参数。如果您 运行 在终端中执行该命令,您应该得到与您从 Python 程序中得到的完全相同的消息。

要修复它,而不是这样写:

    subprocess.run(["xset", "-display :0.0 dpms force off"])

这样写:

    subprocess.run(["xset", "-display", ":0.0", "dpms", "force", "off"])

这导致 xset 将每个参数视为一个单独的词,并且当它们处于那种形式时它知道如何处理它们。

作为替代方案,您可以将单个字符串传递给 subprocess.run 以代替列表:

    subprocess.run("xset -display :0.0 dpms force off")

但正如 subprocess 模块文档的 Frequently Used Arguments 部分所述,如果您的各个参数需要包含空格或其他需要特殊处理的字符,则使用字符串可能会变得难看。所以一般来说,将所有内容都作为单独的列表项的变体使用起来更安全。

这样使用subprocess.run是安全的。使用 os.system 也是安全的(但效率较低),因为在这种情况下,您使用的命令和参数是固定的,并且完全由您的程序提供。 os.system 当其参数由值来自程序外部某处的变量指定时变得危险。