Raspberry Pi Python код не выполняется должным образом при вызове в php сценарии с помощью браузера - PullRequest
0 голосов
/ 19 февраля 2020

У меня Raspberry Pi 1B под управлением Raspbian 10 (Buster) с установленными Python3, Apache2 и PHP, и я оснащен полосой светодиодов WS2812.

У меня есть простой Python скрипт (PixelTestOn.py, см. ниже), который включает все светодиоды. При использовании следующей команды терминала все светодиоды загораются, и текст в сценарии отображается, как и ожидалось:

sudo python3 PixelTestOn.py*

PixelTestOn.py

#! /usr/bin/env python3

print("PixelTestOn started<br>")

from rpi_ws281x import PixelStrip, Color

# LED strip configuration:
LED_COUNT = 30        # Number of LED pixels.
LED_PIN = 18          # GPIO pin connected to the pixels (18 uses PWM!).
# LED_PIN = 10        # GPIO pin connected to the pixels (10 uses SPI /dev/spidev0.0).
LED_FREQ_HZ = 800000  # LED signal frequency in hertz (usually 800khz)
LED_DMA = 10          # DMA channel to use for generating signal (try 10)
LED_BRIGHTNESS = 40   # Set to 0 for darkest and 255 for brightest
LED_INVERT = True     # True to invert the signal (when using NPN transistor level shift)
LED_CHANNEL = 0       # set to '1' for GPIOs 13, 19, 41, 45 or 53

# Create NeoPixel object with appropriate configuration.
strip = PixelStrip(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL)

# Intialize the library (must be called once before other functions).
strip.begin()

# Switch all pixels on
for i in range(strip.numPixels()):
    strip.setPixelColor(i, Color(255, 255, 255))
strip.show()

print("PixelTestOn finished")

exit()

У меня также есть php скрипт (PixelTestOn. php, см. ниже), который должен отображать некоторый текст, выполнить скрипт PixelTestOn.py python, чтобы включить светодиоды, а затем отобразить еще немного текста. При использовании следующей команды терминала отображается код HTML, и все светодиоды загораются, а текст в сценарии python отображается, как и ожидалось:

sudo php PixelTestOn.php

PixelTestOn. php

<html>
<head>
<title>Pixel Test</title>

<h3>Test to turn LEDs on</h3>
<p>Should see all LEDs light up</p>
<p></p>
<p>About to call shell_exec() (5)</p>

<?PHP
echo shell_exec("python PixelTestOn.py");
?>

<p>Returned from shell_exec()</p>

</head>

Однако, когда я ввожу следующее в браузер Chromium, выводится html (не код) и текст в первом операторе print () в начале python код отображается, как и ожидалось, однако светодиоды не загораются, и текст во втором выражении print () в конце кода python не отображается:

localhost/PixelTestOn.php

Если я закомментирую все операторы между 2 операторами print (), затем скрипт выполняется, как и ожидалось, в браузере.

Все файлы хранятся в каталоге / var / www/html, все имеют владельца www-data, и для всех элементов управления доступом установлено значение «Любой».

Вот что я пробовал:

  • Использование shell_exe c (), exe c () и system ( ) в скрипте php
  • с использованием разных брат wsers (Echo, IE, Chrome) на моих Windows 10 P C и Chrome на Android планшете. Обратите внимание, что S SH включен на Pi.
  • Две разные библиотеки управления светодиодами, rpi_ws281x и neopixel
  • Common Gateway Interface (CGI). Я не смог заставить это работать с формой html с кнопкой [Submit], когда кнопка была нажата для ввода данных, в браузере появилось сообщение «Internal Server Error».

Мое конечное намерение - создать электронное табло для игры в крикет c на основе безголового Raspberry Pi с индивидуально адресуемыми светодиодами, к которому можно получить удаленный доступ с помощью планшета Android.

Обновление После комментария Джея я попытался запустить «python3 PixelTestOn.py», т.е. без «sudo» в Терминале, и получил следующее сообщение об ошибке после того, как было выведено выражение «ПиксельТест запущен
»:

Can’t open /dev/mem: Permission denied
Traceback (most recent call last):
  File “PixelTestOn.py”, line 24, in <module>
    strip.begin()
  File “/home/pi/.local/lib/python3.7/site-packages/rpi_ws281x/rpi_ws281x.py”, line 130, in begin
    raise RuntimeError(‘ws2811_init failed with code {0} ({1})’.format(resp, str_resp))
RuntimeError: ws2811_init failed with code -5 (mmap() failed)

Увидев заявление «Отказано в доступе», я запомнил разрешения для файла «/ dev / mem», а затем ввел следующее, чтобы изменить контроль доступа на «Любой» для всех 3 опций.

sudo 777 /dev/mem

Затем я повторно запустил «python3 PixelTestOn.py» в Терминале и, снова после того, как было выведено выражение «PixelTestOn началось
», получил похожую ошибку mes мудрец, но на этот раз, начиная с:

Can’t open /dev/mem: Operation not permitted

Затем я изменил права доступа к / dev / mem к их первоначальным настройкам

1 Ответ

0 голосов
/ 21 февраля 2020

Добро пожаловать в переполнение стека.

В соответствии с приведенной ниже ссылкой, я вижу, что нельзя избежать запуска сценария python при root - https://github.com/jgarff/rpi_ws281x/issues/155#issuecomment - 370939228

Так что вам нужно сделать ниже, наверняка -

echo shell_exec("sudo python PixelTestOn.py"); # Note the 'sudo' prefix

Также, когда вы запускаете PHP через браузер, например, Chromium или Firefox et c, запрос должен пройти через ваш веб-сервер (Apache, NginX et c). Следовательно, ваш PHP скрипт будет выполняться как веб-пользователь, а не root.

Предполагая, что по вашему вопросу ваш веб-пользователь www-data, добавьте текст ниже в ваш файл /etc/sudoers, чтобы www-data мог запускать команды как sudo -

www-data ALL=(ALL) NOPASSWD: ALL

Это должно решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...