lighttpdを使用してPython CGIスクリプトにRPi.GPIOを含める方法は?


13

私は最近、CGIを介してlighttpdで動作するようにpythonをセットアップしました(こちらを参照)。しかし、RPi.GPIOを含めようとすると、スクリプトは実行を停止します(HTMLが出力されないためだと思います)が、エラーログ(/var/log/lighttpd/error.log)にエラー出力はありません。

gpio.py

import RPi.GPIO as GPIO

print "<html>"
print "\t<head>"
print "\t\t<title>GPIO</title>"
print "\t</head>"
print "\t<body>"
print "\t\t<p>"
print "\t\t\tGPIO #17 status: "
print "\t\t</p>"
print "\t</body>"
print "</html>"

スクリプトが実行されないのはなぜですか?許可が原因ですか?確かに、ライブラリを含めるには特別な権限は必要ないでしょうか?スクリプトまたはエラーログにエラー出力がないのはなぜですか?


これは、含まれているファイルまたはファイルの場所の以下の許可/所有権のいずれかまたは両方である可能性があります。問題を修正するには、含まれているファイルを、実行しようとしているファイルと同じディレクトリに移動し、実行しているスクリプトと同じユーザーが所有していることを確認してください。これで問題が解決した場合はお知らせください。許可/所有権の設定とインクルード検索パスの設定についてさらに指示することができます。
スティーブロビラード

私はPythonの初心者ですが、RPi.GPIOは実際のファイルですか?\ cgi-bin \ gpio.pyはpi:piが所有しており、wwwディレクトリの権限はwww-data:www-dataです。
マークイングラム

OK、GPIOピンを制御する必要があるファイルのいくつかは、rootとして実行する必要があります(Web経由で行うと、セキュリティホールが開きます)。lighttpdとCGIをrootとして実行しようとする前に、コマンドラインからスクリプトを動作させると、問題をデバッグするのが簡単になると述べました。RPi.GPIOモジュールをインストールするには、次の手順に従ってくださいlearn.adafruit.com/…。エレクトロニクスの経験はありますか?GPIOピンで何をするつもりだった
スティーブロビラード

1
ああ、私はこれをテストしましたが、単純なスクリプトにimport RPi.GPIO as GPIOは実際にルート権限が必要です!さて、rootとして実行するにはlighttpdを取得する必要があると思います(これは単なるホームプロジェクトです)。
マークイングラム

1
ルートとして実行するオプションとして、このアウトをチェックstackoverflow.com/questions/89228/...
スティーブ・Robillard

回答:


6

「RPi.GPIOをインポートする」前に追加を試みることができます。

import sys 
sys.stderr = sys.stdout
try:
    import RPi.GPIO as GPIO
except Exception as e:
    print e

エラーの診断に役立つ場合があります。

そして、HTML出力の前に次の行を追加します。

print "Content-Type: text/html"     # HTML is following
print                               # blank line, end of headers

http://docs.python.org/library/cgi.htmlを参照してください


6

okertanovからのアドバイスに従った後、RPi.GPIOルートアクセスが必要なため、実際にはPython CGIスクリプトで使用できないことを発見しました。WiringPiのgpio一部として含まれているコマンドラインアプリを呼び出すことで、この問題を回避しました。これは非ルートアカウントから呼び出すことができます。

# Read the GPIO pin using the gpio application

import subprocess as s

def ReadGpio(pin) :
    process = s.Popen(["/usr/local/bin/gpio", "-g", "read", pin], stdout = s.PIPE)
    data, _ = process.communicate()

    data = str.replace(data, \r”, “”)
    data = str.replace(data, \n”, “”)

    return data

0

# Pythonでのコメントを意味します

使うだけ

import RPi.GPIO as GPIO

次に、権限の問題を解決する必要があります


申し訳ありませんが私の間違いでした。その行をコメントアウトしたコードをコピーしました。元の質問から削除しました。
マークイングラム

0

このチュートリアルでは、次のようにPythonの特別なコピーを作成し、rootユーザー権限を付与することをお勧めします。

//check current version
pi@raspberrypi /var/www $ ls -l /usr/bin/python
lrwxrwxrwx 1 root root 9 Jun  6  2012 /usr/bin/python -> python2.7

//copy and chmod
pi@raspberrypi /var/www $ sudo cp /usr/bin/python2.7 /usr/bin/pythonRoot
pi@raspberrypi /var/www $ sudo chmod u+s /usr/bin/pythonRoot

//check that new version has more priveledges
pi@raspberrypi /var/www $ ls -l /usr/bin/pythonRoot
-rwsr-xr-x 1 root root 2674528 Mar 17 18:16 /usr/bin/pythonRoot

次に、CGIを作成するには、ファイルのsudo nano /etc/lighttpd/lighttpd.conf送信元である場所に移動して、新しい/に.py変更/usr/bin/python/します。/usr/bin/pythonRoot

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.