7

設定:

  • ラズベリーパイ
  • nginxWebサーバー
  • PHP5とPHP-CLIがインストールされています

私のPythonスクリプト「lights.py」は、Arduino Unoに接続された[次にUSB経由でPiに接続された]リレーを介してリビングルームのライトをオン/オフにするので、本当にクールです。PiのGPIOピンを使用できたのはわかっていますが、使用しませんでした。とにかく、それはここでは問題ではありません。

Piがホストするサイトを介してWebブラウザーからスクリプトをアクティブ化できるようにしたかったので、次のコードを含む/var/wwww/test/lights.phpがあります。

<?php
 exec('python lights.py');
?>

シンプルですね さて、ブラウザでそのページを参照すると、何も表示されません(予期されていません)が、ライトは状態を変更しません(予期されていません)。 ただし、コマンドラインでユーザーPiとしてログインすると、「php /var/wwww/test/lights.php」を実行でき、問題なく動作します。

これは、nginxがwww-dataというこのユーザーを使用して処理を行っているように見えるためだと思います。おそらく、権限の問題ですか?今、私は未知の領域に迷い込んでいます...「su--www-data」を試して、そのユーザーとしてスクリプトを試すことができるかどうかを確認しましたが、設定したことのないパスワード(および空白)を要求されますパスワードが機能しませんでした)。

ここでの助けは大歓迎です。

更新-これが「ls-la/var / www / test /lights*」です

-rw-r--r-- 1 www-data root  37 Feb  1 23:56 /var/www/test/lights.php
-rwxr-xr-x 1 www-data root 129 Feb  1 23:51 /var/www/test/lights.py

2回目の更新-確認してください:

pi@raspberrypi ~ $ sudo su - www-data
$ pwd
/var/www
$ php ./test/lights.php
python: can't open file 'lights.py': [Errno 2] No such file or directory
$ python ./test/lights.py
Traceback (most recent call last):
  File "./test/lights.py", line 4, in <module>
    ser = serial.Serial('/dev/ttyACM0', 9600)
  File "/usr/local/lib/python2.7/dist-packages/serial/serialutil.py", line 260, in __init__
    self.open()
  File "/usr/local/lib/python2.7/dist-packages/serial/serialposix.py", line 276, in open
    raise SerialException("could not open port %s: %s" % (self._port, msg))
serial.serialutil.SerialException: could not open port /dev/ttyACM0: [Errno 13] Permission denied: '/dev/ttyACM0'

その「/dev/ ttyACM0」デバイスは私のArduino接続であるため、ユーザー「www-data」はそのファイルに出力できないため、そのPythonスクリプトを実行するためのアクセス権を持っていないようです。そのデバイスを「chmod」することはできますか?

3回目の更新-もうすぐ終わりだと思います!

「ls-g/dev / ttyACM0」を使用すると、グループ「dialout」が所有していることがわかりました。「grepdialout/etc / group」を使用すると、ユーザー「Pi」のみが割り当てられていることがわかりました。したがって、「usermod -a -G Dialoutwww-data」を使用して、そのグループにwww-dataを追加しました。

今、それを確認してください:

pi@raspberrypi ~ $ sudo su - www-data
$ cd test
$ php lights.php
$ python lights.py
$

PHPとPythonの両方のスクリプトが機能し、ライトが点いたり消えたりしました。 しかし、ブラウザからWebページ「 lights.php」をロードしても何も起こりません。

4番目の更新 PHPファイルを次のように変更しました。

<?php

exec('python lights.py', $output, $return);

print "Output:";
print $output;
print "<br />";
print "Return:";
print $return;

?>

私が収集したものから、それはexec()ステートメントからデバッグ情報を取得するための適切な方法です。Webページを更新したときの出力は次のとおりです。

Output:Array
Return:1

それは私を助けてくれますか?

4

5 に答える 5

3

PHPは、Webサイト構成でセーフモードで実行するように構成されている可能性があります。セーフモードで実行している場合、などの一部の機能execは無効になります。セーフモードを無効にしてみてください。

もう1つの可能性はlights.py、Webサーバーが実行されているディレクトリにスクリプトが見つからないことです。これを解決するには、のようにスクリプトへのフルパスを使用しますexec("/usr/bin/python /home/armani/lights.py")

もう1つの可能性は、ログに記録されたときにWebサーバーが自分とは異なるユーザーとして実行されていることです(おそらくとしてnouser)。また、このユーザーは一部のリソースにアクセスできない場合があります。

そして、おそらくもっと多くのそのような可能性のあるエラーがあります。発生したエラーの詳細をお知らせください(トレースバックを取得するには、PHPでデバッグを有効にしてみてください)。

于 2013-02-03T00:03:26.753 に答える
3

与えられた答えのどれも私を助けませんでした...実際、私の投稿への私の更新は、私が自分の試行/エラーとグーグルを通して見つけた最終的に答えであったものを記録します。

/ dev / ACM0にアクセスするには、ユーザーwww-dataをダイヤルアウトグループに割り当てる必要があり、(何らかの理由でnginxだけでなく、サーバー全体の)再起動が必要でした。

PYTHON SCRIPT RAN FINE FROM SHELL、およびPHP FILE RAN FINE FROM PHP-CLIと言い続けたときに、なぜこれがパスの問題であると誰もが答え続けたのかわかりません。

とにかく、それが最終的にそれを解決したものです。試してくれたみんなに感謝します。

于 2013-02-05T18:02:33.817 に答える
1

あなたのlights.pyファイルのchmodは何ですか?followindコマンドを試していただけますか?

chmod +x lights.py
于 2013-02-03T00:00:16.623 に答える
1

パスが正しいかどうかを確認してください。phpスクリプトは/var/ wwww/testディレクトリ内から実行されます。Lights.pyファイルもそのディレクトリにありますか?そうでない場合は、ファイルへのフルパスを指定します

于 2013-02-03T00:04:47.187 に答える
1

どちらが現在の作業ディレクトリであるかを確認する必要があります。それが変更したいディレクトリでない場合、またはさらに簡単な場合は、Pythonでフルパスのスクリプトを実行するだけです。

exec('python /var/www/test/lights.py');

于 2013-02-05T15:38:58.773 に答える