Выполнение сценария Python для управления GP IOs с веб-сервера - PullRequest
0 голосов
/ 15 марта 2020

Я работаю над проектом, в котором есть веб-сервер (который в данный момент работает на моем ноутбуке) и RaspberryPi. Я сделал простой сайт с HTML, PHP и Javascript, и у меня есть рабочая python программа на моем RaspberryPi. Я хочу запустить программу python, используя php, в настоящее время я использую эту команду.

exec('sudo python /var/www/LED-Ring/python/examples/LED-Ring.py');

Когда я запускаю команду непосредственно в терминале

sudo python /var/www/LED-Ring/python/examples/LED-Ring.py 

это работает просто отлично.

Я уже добавил следующее

www-data ALL=NOPASSWD: ALL

в sudo visudo (я знаю, что это риск для безопасности, но сейчас мне все равно, я просто хочу заставить его работать)

что мне нужно на Pi, даже если веб-сервер работает на ноутбуке?

единственное, что нужно сделать raspi - это открыть браузер и go на веб-сайте (что он уже делает), а затем всякий раз, когда веб-сервер отправляет команду, сценарий python должен запускаться

проблема, вероятно, связана с разрешениями, потому что я могу запустить python скрипт с

"sudo python /var/www/LED-Ring/python/examples/LED-Ring.py" 

, но я не могу запустить его с

"sudo -u www-data python /var/www/LED-Ring/python/examples/LED-Ring.py"

, когда я использую эту команду, я получаю

Не удалось создать устройство почтового ящика: Операция не разрешено

Файл "/ var / www/LED-Ring/python/examples/LED-Ring.py", строка 52, в module strip.begin

Файл "build / bdist. linux -armv7l / egg / neopixel.py", строка 106 в начале

RuntimeError: ws2811: ошибка инициализации с кодом -9 ( не удалось создать почтовое устройство)

1 Ответ

0 голосов

Не используйте exe c, пожалуйста, это небезопасно. Просто используйте подпроцесс и вы можете передавать информацию между ними с помощью промежуточного файла или с помощью распечаток на оболочке

import subprocess
import time

list_subproc = []
list_to_pass = []
list_to_pass.append(myvar1)
list_to_pass.append(myvar2)
list_to_pass.append(myvar3)
list_to_pass.append(myvar4)

p = subprocess.Popen(['python','dialog29.py',list_to_pass],stdout=subprocess.PIPE,stderr=subprocess.STDOUT) # Call subprocess
list_subproc.append(p.pid)

time.sleep(0.2)
line = p.stdout.readline().lstrip().rstrip()
line = line.decode()
print(line)

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

...