Bagaimana cara memasukkan RPi.GPIO dalam skrip python CGI dengan lighttpd?

13

Saya baru-baru ini mengatur python untuk bekerja dengan lighttpd via CGI (lihat di sini ). Tetapi begitu saya memasukkan RPi.GPIO , skrip berhenti dieksekusi (saya berasumsi karena tidak ada HTML yang dihasilkan), tetapi tidak ada keluaran kesalahan ke log kesalahan ( /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>"

Mengapa skrip tidak dieksekusi? Apakah karena izin? Tentunya, termasuk perpustakaan seharusnya tidak memerlukan izin khusus? Mengapa tidak ada output kesalahan baik di skrip atau di log kesalahan?

Tandai Ingram
sumber
Ini kemungkinan salah satu atau kedua dari izin / kepemilikan berikut dari file yang disertakan atau lokasi file. Untuk memperbaiki masalah, coba pindahkan file yang disertakan ke direktori yang sama dengan file yang Anda coba jalankan dan pastikan itu dimiliki oleh pengguna yang sama dengan skrip yang Anda jalankan. Jika ini menyelesaikan masalah, beri tahu kami dan kami dapat mengarahkan Anda lebih lanjut untuk mengatur izin / kepemilikan dan mengatur jalur pencarian yang disertakan.
Steve Robillard
Saya seorang pemula dengan Python, apakah RPi.GPIO file yang sebenarnya (di mana itu)? \ cgi-bin \ gpio.py dimiliki oleh pi: pi dan izin untuk direktori www adalah www-data: www-data.
Mark Ingram
OK, beberapa hal yang dibutuhkan file apa pun untuk mengontrol Pin GPIO perlu dijalankan sebagai root, (yang akan membuka lubang keamanan ketika dilakukan melalui web). Setelah mengatakan bahwa Anda akan memiliki waktu lebih mudah men-debug masalah jika Anda mendapatkan skrip untuk bekerja dari baris perintah sebelum mencoba untuk mendapatkan lighttpd dan CGI untuk dijalankan sebagai root. Untuk memasang Modul RPi.GPIO, ikuti instruksi ini pelajari.adafruit.com/... . Apakah Anda memiliki pengalaman elektronik? Apa yang akan Anda lakukan dengan pin GPIO
Steve Robillard
1
Ah, saya baru saja menguji ini, dan skrip sederhana import RPi.GPIO as GPIO sebenarnya membutuhkan hak akses root! Sekarang saya kira saya perlu menjalankan lighttpd untuk dijalankan sebagai root (ini hanya proyek rumahan).
Tandai Ingram
1
lihat ini sebagai opsi untuk berjalan sebagai root stackoverflow.com/questions/89228/…
Steve Robillard

Jawaban:

6

Anda dapat mencoba menambahkan sebelum 'impor RPi.GPIO':

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

Mungkin membantu untuk mendiagnosis kesalahan.

Dan tambahkan baris ini sebelum output html Anda:

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

Lihat http://docs.python.org/library/cgi.html

okertanov
sumber
6

Setelah mengikuti saran dari okertanov, saya menemukan bahwa Anda tidak dapat benar-benar menggunakan RPi.GPIOskrip python CGI karena memerlukan akses root. Saya mengatasi masalah dengan memanggil gpioaplikasi baris perintah yang disertakan sebagai bagian dari WiringPi , ini dapat dipanggil dari akun non-root.

# 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
Tandai Ingram
sumber
0

# berarti komentar dengan Python

Gunakan saja

import RPi.GPIO as GPIO

Sekarang Anda harus menyelesaikan masalah izin

John La Rooy
sumber
Maaf itu adalah kesalahan saya, saya telah menyalin kode saya yang memiliki garis komentar. Saya sudah menghapusnya dari pertanyaan awal.
Tandai Ingram
0

Tutorial ini merekomendasikan untuk membuat salinan khusus Python dan memberikannya hak istimewa pengguna root, seperti:

//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

Dan kemudian, untuk membuat CGI Anda, buka sudo nano /etc/lighttpd/lighttpd.confdan temukan di mana pun Anda mengarahkan .pyfile dan ubah /usr/bin/python/ke yang baru /usr/bin/pythonRoot/

Seph Reed
sumber