python返回256的代码

python返回256的代码,python,linux,python-2.7,raspberry-pi,raspbian,Python,Linux,Python 2.7,Raspberry Pi,Raspbian,这是raspberrypi.stackexchange.com转发的问题。当我试图在raspberry pi上使用python时,因为它不涉及任何特定于pi的东西,所以我在这里发布的某个人建议使用它。原来的帖子是 我试图制作一个web ui来更改rapsberry pi中的日期,但我一直得到256的返回码 目前我的情况如下: 网页->向python脚本提交ajax请求 python检查命令的类型(本例中为时间/日期命令),并将一个字符串拼凑在一起,如下所示: sudo date --set="

这是raspberrypi.stackexchange.com转发的问题。当我试图在raspberry pi上使用python时,因为它不涉及任何特定于pi的东西,所以我在这里发布的某个人建议使用它。原来的帖子是


我试图制作一个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作为错误返回码。树莓圆周率上的日期当然不会改变,因为我会在前后手动检查它

但是,如果我在raspberry pi上手动进入python并尝试:

commandString = 'sudo date --set="20130901 20:10"'
os.system(commandString)
它没有问题。如果我在不使用sudo的情况下尝试它,那么我也会得到256的返回值,所以我认为这可能是我的原始脚本的权限问题。我试图检查我的脚本的权限,它似乎是好的?(
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
echo | sudo-S date--set=“20130829 02:02
虽然这样输入我的根密码可能不是一个好主意,但我尝试了一下,得到了相同的结果:在终端/shell和python解释器中进行操作时,它可以工作,但不能通过python的web ui。

更新:,或者使用
/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)
p、 通信(输入=“”)
这是启动子流程(通过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'))
p=subprocess.Popen('sudo-S date--set…',shell=True, stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE) 输出,err=p.communicate(输入=“”) 打印“\n”.join(“out:+x代表x输入输出.split('\n')) 打印“\n”.join(“err:+x代表错误分割('\n'))
…或者只需将
的内容取出
和/或
err
并对其进行解析。

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


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

您好,尝试第一种方法(不需要此部分的输出)现在会产生错误代码1。从搜索中,我认为这意味着“不允许操作””“好的。很抱歉马上发布另一条评论,但这真的很奇怪。只是为了好玩,我在没有sudo的情况下尝试了它(只是date--set=…),并将p.communicate更改为p.wait。有趣的是,我得到的返回码是0,它似乎可以工作。O.O为什么添加sudo(带密码和不带密码)会得到返回码1,而没有密码会让它通过?(在脚本中,os.geteuid()始终为0)。我想我需要休息一下,关闭我的pi,然后稍后再恢复,因为这让我觉得它工作的原因非常随机=_=是的。。。这似乎现在起作用了。使用子进程而不是os.system,并且在我的命令中不使用“sudo”。实际上,
sudo
这件事也让我困惑不解,没有它你怎么能过得去?我不确定。最初我想使用os.system(“date--set=…”),因为它说我的脚本是在pi/root下运行的。这在pythonshell中工作,但在脚本中返回256。考虑到这是一个权限问题(有消息称错误代码是*乘256),我添加了“sudo”等等。最后,我使用了您的建议,即使用python的子进程,但不使用sudo,即:p=subprocess.Popen(“date--set=…”,shell=True,stdin=subprocess.PIPE);p、 等待();返回p.returncode;我没有在配置/权限方面更改任何内容。我希望这应该是它的工作原理,而不仅仅是偶然的。