Перво-наперво: в будущих вопросах не просто говорите: «Это не работает, это дает мне ошибку». Покажите нам точно, что было сообщение об ошибке.
Я предполагаю, что сообщение, которое вы начали, было примерно таким:
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
становится опасным, когда его аргументы задаются переменными, значения которых берутся откуда-то вне вашей программы.