設定:
- ラズベリーパイ
- 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
それは私を助けてくれますか?