код возврата 256 из python

Это повторно размещенный вопрос от raspberrypi.stackexchange.com. Хотя я пытаюсь заставить что-то работать на python на raspberry pi, поскольку это не связано с какими-либо специфическими для pi вещами, это было предложено кем-то, кого я публикую здесь. Исходное сообщение находится здесь.


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

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

веб-страница -> отправляет запрос ajax в скрипт python. python проверяет, какой тип команды (в данном случае это команда времени/даты), и объединяет строку, выглядящую следующим образом:

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

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

os.system(commandString)

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

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

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

Однако, если я вручную войду в python на raspberry pi и попробую:

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

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

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


person mitim    schedule 02.10.2013    source источник


Ответы (2)


ОБНОВЛЕНИЕ: или, может быть, просто используйте /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 и проанализируйте их.

person Erik Kaplun    schedule 02.10.2013
comment
привет, попытка первого метода (на самом деле не нужен вывод для этой части) теперь дает код ошибки 1. Из поиска я думаю, что это означает, что операция не разрешена? - person mitim; 03.10.2013
comment
в порядке. извините, что сразу же оставляю еще один комментарий, но это действительно странно. Ради интереса я попробовал без sudo (просто date --set=...) и заменил p.communicate на p.wait. Интересно, что я получаю код возврата 0, и, похоже, он работает. O.o Любые идеи о том, почему добавление sudo (с паролем и без него) дает код возврата 1, а его отсутствие позволяет пройти? (В сценарии os.geteuid() всегда был равен 0). Я думаю, мне нужно сделать перерыв, выключить мой пи, а затем снова включить его позже, чтобы проверить, так как это кажется очень случайным в отношении того, почему он работает. =_= - person mitim; 03.10.2013
comment
да... кажется, теперь это работает. используя подпроцесс вместо os.system и не используя «sudo» с моей командой. - person mitim; 03.10.2013
comment
на самом деле эта штука sudo меня тоже озадачила — как вы без нее обходились? - person Erik Kaplun; 03.10.2013
comment
Я не уверен. Первоначально я думал использовать os.system(date --set=...), поскольку он сказал, что мой скрипт запускался под pi/root. Это работает в оболочке python, но в скрипте возвращает 256. Полагая, что это проблема с правами доступа (источники говорят, что коды ошибок * на 256), я добавил sudo и так далее. В конце концов, я воспользовался вашим предложением использовать подпроцесс python, но без sudo: p = subprocess.Popen(date --set=..., shell=True, stdin=subprocess.PIPE); р.ждите(); вернуть p.returncode; Я ничего не менял в конфигурации/разрешениях. Я надеюсь, что это должно быть так, как это работает, а не просто случайно. - person mitim; 04.10.2013

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

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

person Ber    schedule 02.10.2013