在 subprocess.run 中将 sudo 放在哪里?
Where to put sudo in subprocess.run?
我正在尝试从我的 python 应用程序调用 bash 命令以更改触摸屏上的背景灯。 python 应用程序将在我的 Raspberry Pi (Rasbian/stretch) 上 运行。
在终端中 运行 bash 命令并不复杂:sudo sh -c "echo 80 > /sys/class/backlight/rpi_backlight/brightness"
肯定会使屏幕变暗(这正是我想要的)。但是如何在我的 python 应用程序中 sudo
脚本? (我知道有几个线程在谈论这个,例如这个 Using sudo with Python script,但我不明白在实践中该怎么做?)
这是我的代码:
#!/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
部分,但我应该把它放在哪里?
将其放在 shell 前面,就像您进行交互一样:
subprocess.run(['sudo', 'bash', '-c', bashCommand])
我建议只 运行 使用 sudo 连接你的 python 脚本...即:sudo myscript.py
。这样,它可能 运行 的任何命令都已经拥有特权。
您可以使用 that_other_guy 的答案,但您的脚本仍会提示您输入密码(至少在我的情况下是这样)。所以这个答案不是很好
如果你真的想自动化它,但你不想 运行 它作为 root...你需要使用 that_other_guys 的答案,但也要回显你的密码,如图所示 here.
虽然这有点老套。我只是 运行 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']
我正在尝试从我的 python 应用程序调用 bash 命令以更改触摸屏上的背景灯。 python 应用程序将在我的 Raspberry Pi (Rasbian/stretch) 上 运行。
在终端中 运行 bash 命令并不复杂:sudo sh -c "echo 80 > /sys/class/backlight/rpi_backlight/brightness"
肯定会使屏幕变暗(这正是我想要的)。但是如何在我的 python 应用程序中 sudo
脚本? (我知道有几个线程在谈论这个,例如这个 Using sudo with Python script,但我不明白在实践中该怎么做?)
这是我的代码:
#!/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
部分,但我应该把它放在哪里?
将其放在 shell 前面,就像您进行交互一样:
subprocess.run(['sudo', 'bash', '-c', bashCommand])
我建议只 运行 使用 sudo 连接你的 python 脚本...即:sudo myscript.py
。这样,它可能 运行 的任何命令都已经拥有特权。
您可以使用 that_other_guy 的答案,但您的脚本仍会提示您输入密码(至少在我的情况下是这样)。所以这个答案不是很好
如果你真的想自动化它,但你不想 运行 它作为 root...你需要使用 that_other_guys 的答案,但也要回显你的密码,如图所示 here.
虽然这有点老套。我只是 运行 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']