RPi.GPIO, lighttpd içeren bir python CGI betiğine nasıl eklenir?


13

Geçenlerde CGI aracılığıyla lighttpd ile çalışmak için python ayarladım ( buraya bakın ). Ama RPi.GPIO dahil etmek için gitmek dakika , komut dosyası (HTML çıktı yok çünkü varsayıyorum) yürütmeyi durdurur, ancak hata günlüğüne ( /var/log/lighttpd/error.log) hata çıkışı yok .

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

Komut dosyası neden çalışmıyor? İzinlerden mi kaynaklanıyor? Elbette, kütüphaneyi dahil etmek için herhangi bir özel izin gerekmez mi? Neden komut dosyasında veya hata günlüğünde hata çıktısı yok?


Bu, dahil edilen dosyanın veya dosyaların konumunun aşağıdaki izinlerinden / sahipliklerinden biri veya her ikisi olabilir. Sorunu gidermek için, dahil edilen dosyayı çalıştırmaya çalıştığınız dosyayla aynı dizine taşıyın ve çalıştırdığınız komut dosyasıyla aynı kullanıcıya ait olduğundan emin olun. Bu sorunu çözüyorsa bize bildirin; izinleri / sahipliği ayarlama ve arama arama yolunu ayarlama konusunda sizi yönlendirebiliriz.
Steve Robillard

Ben Python ile bir acemi, RPi.GPIO gerçek bir dosya (nerede)? \ cgi-bin \ gpio.py, pi: pi'ye aittir ve www dizini için izinler www-data: www-data'dır.
Mark Ingram

Tamam, GPIO Pinlerini kontrol etmek için gereken herhangi bir dosyanın kök olarak çalışması gereken birkaç şey (web üzerinden yapıldığında bir güvenlik deliği açacaktır). Komut satırından lighttpd ve CGI'yi root olarak çalıştırmaya çalışmadan önce komut dosyasının çalışmasını sağlarsanız, sorunların hatalarını ayıklamak için daha kolay bir zamanınız olacağını söyledikten sonra. RPi.GPIO Modülünü kurmak için learn.adafruit.com/… talimatlarını izleyin . Elektronik deneyiminiz var mı? GPIO pinleriyle ne yapacaktınız
Steve Robillard

1
Ah, bunu test ettim ve basit bir senaryosu import RPi.GPIO as GPIOaslında kök ayrıcalıkları gerektiriyor! Şimdi sanırım root olarak çalıştırmak için lighttpd almam gerekiyor (bu sadece bir ev projesi).
Mark Ingram

1
root olarak çalışma seçeneği olarak bunu kontrol edin stackoverflow.com/questions/89228/…
Steve Robillard

Yanıtlar:


6

'Import RPi.GPIO' dan önce eklemeyi deneyebilirsiniz:

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

Bir hatayı teşhis etmeye yardımcı olabilir.

Ve html çıktısından önce şu satırları ekleyin:

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

Bkz. Http://docs.python.org/library/cgi.html


6

Okertanov'un tavsiyelerini takip ettikten sonra RPi.GPIO, kök erişim gerektirdiği için aslında bir python CGI betiğinde kullanamayacağınızı keşfettim . WiringPi'nin birgpio parçası olarak dahil edilen komut satırı uygulamasına çağırarak sorunu çözdüm , bu kök olmayan bir hesaptan çağrılabilir.

# 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'da bir yorum anlamına gelir

Sadece kullan

import RPi.GPIO as GPIO

Şimdi izin problemini çözmeniz gerekecek


Üzgünüm, bu benim hatamdı, bu satırı yorumladı kodumu kopyalamıştı. Orijinal sorudan kaldırdım.
Mark Ingram

0

Bu eğitici Python'un özel bir kopyasını oluşturmanızı ve buna kök kullanıcı ayrıcalıklarını vermenizi önerir:

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

Ve sonra, CGI'nizi yapmak için, nereye giderseniz gidin dosyalarınızı sudo nano /etc/lighttpd/lighttpd.confyönlendirin .pyve /usr/bin/python/yeni /usr/bin/pythonRoot/

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.