Где поместить sudo в subprocess.run? - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь вызвать команду bash из моего приложения python, чтобы изменить подсветку на сенсорном экране.Приложение python будет работать на моем Raspberry Pi (Rasbian / stretch).

Выполнить команду bash в терминале несложно: sudo sh -c "echo 80 > /sys/class/backlight/rpi_backlight/brightness" наверняка затемнит экран (что я и хочу).Но как я могу sudo скрипты в моем приложении Python?(Я знаю, что об этом говорят несколько потоков, например об этом Использование sudo со скриптом Python , но я не понимаю, как это сделать на практике?)

Это мой код:

#!/usr/bin/env python3
import subprocess
import time
import sys

# read arguments from the run command: 
# idle time before dim (in seconds)
idleTimeBeforeDimMS = int( sys.argv[1] )*1000

# brightness when dimmed (between 0 and 255)
brightnessDimmed = int( sys.argv[2] )
brightnessFull = 255

def get(cmd):
    # just a helper function
    return subprocess.check_output(cmd).decode("utf-8").strip()

isIdle0 = False
stateChanged = False
timeIntervalToWatchChangesS = 100 / 1000

while True:
    time.sleep( timeIntervalToWatchChangesS )

    currentIdleTimeMS = int( get("xprintidle") )

    isIdle = currentIdleTimeMS > idleTimeBeforeDimMS
    stateChanged = isIdle0 != isIdle

    if isIdle and stateChanged:
        # idling
        bashCommand = "echo 50 > /sys/class/backlight/rpi_backlight/brightness"
        subprocess.run(['bash', '-c', bashCommand])
    elif not isIdle and stateChanged:
        # active
        bashCommand = "echo 255 > /sys/class/backlight/rpi_backlight/brightness"
        subprocess.run(['bash', '-c', bashCommand])

        # set current state as initial one for the next loop cycle
    isIdle0 = isIdle

Если я запускаю скрипт прямо из коробки, я получаю ошибку с моей командой bash: bash: /sys/class/backlight/rpi_backlight/brightness: Permission denied.Это нормально, я понимаю, что мне не хватает sudo -части, но где мне его поставить?

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Я бы порекомендовал просто запустить ваш скрипт на python с sudo ... т.е.: sudo myscript.py.Таким образом, любые команды, которые он может выполнить, уже будут иметь привилегии.

Вы можете использовать ответ that_other_guy, но ваш скрипт все равно запросит у вас пароль (по крайней мере, в моем случае это было).Поэтому этот ответ не так хорош.

Если вы действительно хотите автоматизировать его, но не хотите запускать его как root ... вам нужно будет использовать ответ that_other_guys, но также вывести свой пароль, как показано здесь .

Хотя это немного глупо.Я бы просто запустил сам скрипт python с привилегиями root.

Однако, если вы действительно не хотите запускать его как root, вы можете сделать это:

>>> from subprocess import run, PIPE
>>> cmd = "echo mypassword | sudo -S ls"
>>> out = run(cmd, shell=True, stdout=PIPE)
>>> output = [i for i in out.stdout.decode().split('\n') if i]
>>> output
['build', 'dist', '__init__.py', 'palindrome', 'palindrome.egg-info', 'LICENSE', 'README.md', 'setup.py']
1 голос
/ 17 апреля 2019

Поместите его перед оболочкой, как в интерактивном режиме:

subprocess.run(['sudo', 'bash', '-c', bashCommand])
...