2013-10-02 93 views
1

这是一个来自raspberrypi.stackexchange.com的转贴问题。虽然我试图在树莓派上使用python,但由于它不涉及任何pi特定的事情,所以我在这里发布了一些人的建议。原帖是here从python返回256代码


我试图做一个Web UI来更改rapsberry PI的日期,但我不断收到256

返回代码目前我有什么是这样的:

网页 - >提交一个Ajax请求python脚本 蟒蛇检查字符串找什么类型的命令(在这种情况下,时间/日期命令),拼在一起的,如:

sudo date --set="20130901 20:10" 

并将其存储在变量commandString中。然后python去:

os.system(commandString) 

和返回值一直传递到网站ui打印出来。

我现在还将commandString的值返回到网络用户界面以验证它,它看起来没问题。

问题是,我每次测试时,都会返回256作为错误返回码。树莓派上的日期当然不会改变,因为我在前后手动检查它。

但是,如果我手动去到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到python。

回答

0

UPDATE:或者只是使用/usr/bin/sudo /bin/date ...来确保找到命令。

试试这个:

import subprocess 

p = subprocess.Popen('sudo -S date --set ...', shell=True, stdin=subprocess.PIPE) 
p.communicate(input='<your password>') 

这是推出一个子进程(通过外壳)的更合适的方式,并将其发送一些输入。

如果您还需要阅读过程的输出,然后例如:

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内容,并分析它们。

+0

你好,尝试第一种方法(不需要输出这个部分)现在产生一个错误代码1.从搜索中,我认为这意味着“操作不允许”? – mitim

+0

好的。抱歉,马上发表另一条评论,但这真的很奇怪。为了好玩,我尝试了没有sudo(只是日期--set = ...),并将p.communicate改为p.wait。有趣的是,我得到我的返回码为0,它似乎工作。 O.o关于为什么添加sudo(有和没有密码)的任何想法都给出了1的返回码,但没有让它通过? (在脚本内os.geteuid()始终为0)。我想我需要休息一下,关闭我的pi,然后再选择它,以后再验证,因为这对于它的工作原理来说非常随意。 = _ = – mitim

+0

是...这似乎现在工作。使用子进程而不是os.system而不使用'sudo'与我的命令。 – mitim

0

检查环境是否实际上可以在搜索路径中找到sudodate(或任何其他您想要执行的命令)。

您也可以使用绝对路径到sudo和其他命令,例如, /usr/sbin/sudo