Выключите экран в Linux через Python3 - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь реализовать файл python3 для отключения экрана компьютера, как подробно здесь , команда:

xset -display :0.0 dpms force off

Введена в Терминал работает, он выключает экран, и ему даже не нужна другая команда, чтобы включить его, потому что любое нажатие клавиши включит его.

Теперь, как реализовать это в python, особенно с subprocess, так как я слышал, что модуль os не очень безопасен в использовании.

Я пробовал

import subprocess

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

Но он не работает, он выдает ошибку , Пожалуйста, помогите, и скажите мне, безопасно ли запускать его таким образом или есть другое решение для этого, начиная с python.

1 Ответ

0 голосов
/ 26 марта 2020

Перво-наперво: в будущих вопросах не просто говорите: «Это не работает, это дает мне ошибку». Покажите нам точно, что было сообщение об ошибке.

Я предполагаю, что сообщение, которое вы начали, было примерно таким:

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, использование строки может привести к некрасиво, если ваши индивидуальные аргументы должны содержать пробелы или другие символы, которые требуют особой обработки. Поэтому в целом вариант, в котором все в отдельном элементе списка, безопаснее использовать.

Безопасно использовать subprocess.run, как это. Было бы также безопасно (но менее эффективно) использовать os.system, потому что в этом случае используемые вами команда и аргументы являются фиксированными и полностью предоставляются вашей программой. os.system становится опасным, когда его аргументы задаются переменными, значения которых берутся откуда-то вне вашей программы.

...