2013-10-02 4 views
1

Это заданный вопрос от raspberrypi.stackexchange.com. В то время как я пытаюсь заставить что-то работать на python на малине pi, так как оно не связано с какой-либо спецификой pi-специфики, это было предложено кем-то, которого я отправляю здесь. Оригинальная запись - here.код возврата из 256 python


Я пытаюсь сделать веб-интерфейс, чтобы изменить дату в rapsberry пи, но я получаю код возврата 256.

В настоящее время, что у меня есть выглядит следующим образом:

веб-страница -> отправляет запрос Аякса питон скрипт проверки питона, какой тип команды (команду даты/времени в данном случае) и куски вместе строка выглядит как:

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

и сохраняет его в переменной commandString. Затем python идет:

os.system(commandString) 

и возвращаемое значение передается вплоть до веб-страницы ui, где оно распечатывается.

В настоящее время я также возвращаю значение commandString в Интернете, чтобы проверить его, и все выглядит нормально.

Проблема в том, что каждый раз, когда я тестирую, я возвращаю 256 в качестве кода возврата ошибки. Дата на малине pi, конечно, не меняется, поскольку я вручную проверяю ее до и после.

Однако, если я вручную идти к питона на Raspberry Pi и попробовать:

commandString = 'sudo date --set="20130901 20:10"' 
os.system(commandString) 

Он работает без проблем. Если я попробую без sudo, тогда я получу возвращаемое значение 256, поэтому я подумал, что это проблема с правами на исходный скрипт. Я попробовал this link, чтобы проверить права моего сценария, и, похоже, все в порядке? (os.geteuid() is 0)

Если это важно, я использую lighttpd и fastcgi для запуска python с веб-сайта ui. Моя конфигурация 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 

Хотя это, вероятно, не очень хорошая идея, чтобы положить в мой корневой пароль, как это, я попробовал и получил тот же результат: он работает, когда выполняется в терминале/оболочке и внутри интерпретатора python, но не через веб-интерфейс 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 (just date --set = ...) и изменил p.communicate на p.wait. Интересно, что я получаю код возврата 0 и, похоже, работает. O.o Любые идеи о том, почему добавление sudo (с и без пароля) дает код возврата 1, в то время как его отсутствие не позволяет ему пройти? (Внутри скрипта os.geteuid() всегда было 0). Я думаю, что мне нужно сделать перерыв, выключить мой пи, затем забрать его обратно позже, потому что это кажется очень случайным, почему он работает. = _ = – mitim

+0

yup ... похоже, теперь это работает. используя подпроцесс вместо os.system и не используя 'sudo' с моей командой. – mitim

0

Проверьте, действительно ли на пути поиска можно найти sudo и date (или любую другую команду, которую вы хотите выполнить).

Вы также можете использовать абсолютные пути до sudo и другие команды, например. /usr/sbin/sudo

Смежные вопросы