php nu poate apela python (Raspberry Pi, Python, Php)

Aymen Aladhami a intrebat.
a intrebat.

Când apelez un simplu script python care clipește LED o dată, dintr-un script PHP prin browser, nu se întâmplă nimic.

și am adăugat aceste linii în fișierul sudoers.

apache ALL=(ALL) NOPASSWD: ALL
apache2 ALL=(ALL) NOPASSWD: ALL
www-data ALL=(ALL) NOPASSWD: ALL
adm ALL=(ALL) NOPASSWD: ALL

/var/www/html owner&Group este www-datași scriptul python owner&Group este www-data de asemenea,

care este problema?

<html>
<head>
<?php
if (isset($_POST['RedON']))
{
exec('sudo python /var/www/html/xbee.py');
}
if (isset($_POST['RedOFF']))
{
exec('sudo python /home/pi/xbee2.py');
}
if (isset($_POST['YellowON']))
{
exec('sudo python /var/www/html/xbee2.py');
}
if (isset($_POST['YellowOFF']))
{
exec('sudo python /var/www/gpio/yellow_off.py');
}
if (isset($_POST['GreenON']))
{
exec('sudo python /var/www/gpio/green_on.py');
}
if (isset($_POST['GreenOFF']))
{
exec('sudo python /var/www/gpio/green_off.py');
}
?>

  <title></title>
</head>
<body>
<form method="post">
  <table
 style="width: 75%; text-align: left; margin-left: auto; margin-right: auto;"
 border="0" cellpadding="2" cellspacing="2">
    <tbody>
      <tr>
        <td style="text-align: center;">Turn LED on</td>
        <td style="text-align: center;">Turn LED off</td>
  </tr>
  <tr>
    <td style="text-align: center;"><button name="RedON">Red On</button></td>
    <td style="text-align: center;"><button name="RedOFF">Red Off</button></td>
  </tr>
  <tr>
    <td style="text-align: center;"><button name="YellowON">Yellow On</button></td>
    <td style="text-align: center;"><button name="YellowOFF">Yellow Off</button></td>
  </tr>
  <tr>
    <td style="text-align: center;"><button name="GreenON">Green On</button></td>
    <td style="text-align: center;"><button name="GreenOFF">Green Off</button></td>
  </tr>
</tbody>
  </table>
</form>
</body>
</html>

Nu: scriptul python funcționează în mod normal în SSH.

Comentarii

  • Nu sunt sigur care este problema ta din start, dar există un truc care ne-ar putea ajuta să depistăm mai ușor această problemă. Înfășurați declarațiile exec astfel: echo(exec('sudo python /var/www/html/xbee.py 2>&1'));. –  > Por user202720202827.
  • Am adăugat două lucruri acolo. Primul, echo rezultatul instrucțiunilor exec. Aceasta va imprima tot ceea ce apelul tău python returnează pe pagina web. Totuși, acest lucru nu vă ajută decât parțial, deoarece orice erori care apar sunt tipărite pe stderr în loc de stdout. Adăugând 2>&1 după scriptul python, aceasta va redirecționa ieșirea care este destinată pentru stderr către stdout astfel încât echo să o poată imprima. Încercați și anunțați-mă ce erori apar. –  > Por user202720202827.
  • De asemenea, probabil că ești conștient, dar aceasta nu este o practică bună de a face pe paginile publice 🙂 Este un pic revelator despre sistemul tău. –  > Por user202720282827.
  • Am triad înainte de același script PHP și python în același Raspberry pi, și este lucrat, pentru că a existat o eroare în Raspberry OS, am fost format, și când am încercat să instaleze același script din nou nu funcționează. –  > Por Aymen Aladhami.
  • De fapt, ar putea fi la fel de simplu ca și faptul că ați numit fișierul dvs. index.html nu index.php astfel încât să nu ruleze prin interpretor. –  > Por calcinai.
3 răspunsuri
calcinai

Aceasta este o problemă cu care se confruntă o mulțime de oameni, și nu este întotdeauna doar din cauza lipsei de permisiune sudo.

Câteva cauze posibile ar putea fi:

  • Permisul/sudo (după cum știți deja)
  • python ar putea să nu fie disponibilă în fișierul www-data mediul utilizatorului

Din moment ce ați fost destul de agresiv cu permisiunile sudo, probabil că nu este vorba de asta. Există două modalități principale (la care mă pot gândi) de a rezolva a doua posibilitate.

  • Utilizați calea completă către python (de ex. /usr/bin/python) în scriptul dvs. PHP. Puteți să vă asigurați că o utilizați pe aceeași ca atunci când utilizați SSH, tastând which python
  • Faceți scripturile dvs. direct executabile. Acest lucru ar necesita 3 pași:

    1. Specificați interpretorul (Python) cu un shebang la începutul scripturilor dvs. python. Un mod obișnuit de a face acest lucru este #!/usr/bin/env python
    2. Adăugați permisiunea de execuție chmod +x /var/www/gpio/x.py
    3. Modificați codul PHP pentru a reflecta acest lucru exec('sudo /var/www/gpio/x.py');

Alternativ,

Am lucrat la o bibliotecă php pentru a depăși exact această problemă. Este PHP nativ și oferă un API asincron pentru manipularea GPIO. Nu necesită sudo pentru operațiunile de bază, cu condiția să adăugați www-data utilizator la gpio grup.

Diego Dyan

Am avut o problemă similară încercând să rulez scripturi Python prin PHP într-un browser.

Cred că problema se bazează pe codul din aceste fișiere Python. probabil că în codul tău python imporți biblioteci care accesează anumite dispozitive care au nevoie de permisiune.

Deci, trebuie să setați permisiunea la dispozitivul în sine, nu la Phyton sau la scriptul Python.

De exemplu, dacă codul Python citește date de pe USB, trebuie să setați permisiunea corectă la fișierul ttyUSB corect din dosarul dispozitivului: sudo chmod 777 /dev/ttyUSB0

Raeen

Puteți utiliza phpy – bibliotecă pentru php.

Fișier PHP:

<?php
  require_once "vendor/autoload.php";

  use appcoreApp;

  $app = new App();
  $python = $app->python;
  $output = $python->gen(your python path,data....);
  $python->dump($output);

Fișier Python:

import include.library.phpy as phpy
print(phpy.get_data(number of data , first = 1 , two =2 ...))

Puteți vedea, de asemenea, un exemplu în pagina github.

Tags:,