这是来自raspberrypi.stackexchange.com的重新发布的问题。虽然我试图在树莓派上使用python工作,但由于它不涉及任何特定于pi的东西,所以我在这里发布的人建议。原帖是here。
我正在尝试创建一个web ui来更改rapsberry pi中的日期,但我一直得到256的返回码。
目前我的情况如下:
网页 - >向python脚本提交ajax请求 python检查什么类型的命令(在这种情况下是一个时间/日期命令)并将一个字符串拼凑在一起,如下所示:
sudo date --set="20130901 20:10"
并将其存储在变量commandString
中。然后python继续:
os.system(commandString)
并且返回值一直传递到打印出来的web ui。
我目前也将commandString
值返回给web ui以验证它并且看起来没问题。
问题在于,每次测试时,我都会返回256作为错误返回码。树莓派上的日期当然不会改变,因为我手动检查它之前和之后。
但是,如果我手动进入覆盆子pi上的python并尝试:
commandString = 'sudo date --set="20130901 20:10"'
os.system(commandString)
没有任何问题。如果我在没有sudo
的情况下尝试它,那么我的返回值也是256,所以我想也许这是我原始脚本的权限问题。我试过this link检查我的脚本的权限,它似乎没问题? (os.geteuid()
是0)
如果重要,我使用lighttpd和fastcgi从web ui运行python。我的lighttpd配置目前是:
fastcgi.server = (
".py" => (
"python-fcgi" => (
"socket" => "/tmp/fastcgi.python.socket",
"bin-path" => "/var/www/command.py",
"check-local" => "disable",
"max-procs" => 1)
)
)
关于我缺少的任何想法?
在原帖上,还有人建议我尝试以下内容:
echo <password> | sudo -S date --set="20130829 02:02
虽然这样输入我的root密码可能不是一个好主意,但我尝试了它并得到了相同的结果:它在终端/ shell和python解释器中工作时有效,但不能通过web ui来实现蟒。
答案 0 :(得分:0)
更新:或者只是使用/usr/bin/sudo /bin/date ...
来确保找到命令。
试试这个:
import subprocess
p = subprocess.Popen('sudo -S date --set ...', shell=True, stdin=subprocess.PIPE)
p.communicate(input='<your password>')
这是启动子进程(通过shell)并向其发送一些输入的更合适的方法。
如果您还需要阅读流程的输出,那么例如:
p = subprocess.Popen('sudo -S date --set ...', shell=True,
stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate(input='<your password>')
print "\n".join("out: " + x for x in out.split('\n'))
print "\n".join("err: " + x for x in err.split('\n'))
...或者只是获取out
和/或err
的内容并进行解析。
答案 1 :(得分:0)
检查环境是否可以在搜索路径中找到sudo
和date
(或您要执行的任何其他命令)。
您还可以使用sudo
的绝对路径和其他命令,例如/usr/sbin/sudo