从python返回256的代码

时间:2013-10-02 09:58:30

标签: python linux python-2.7 raspberry-pi raspbian

这是来自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来实现蟒。

2 个答案:

答案 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)

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

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