วิธีการรวม RPi.GPIO ในสคริปต์ CGI หลามด้วย lighttpd?


13

ฉันเพิ่งติดตั้ง python เพื่อทำงานกับ lighttpd ผ่าน CGI (ดูที่นี่ ) แต่นาทีที่ฉันจะรวม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>"

ทำไมสคริปต์ไม่ทำงาน? เป็นเพราะการอนุญาตหรือไม่ แน่นอนรวมถึงห้องสมุดไม่ควรต้องมีการอนุญาตพิเศษหรือไม่? เหตุใดจึงไม่มีผลลัพธ์ข้อผิดพลาดทั้งในสคริปต์หรือในบันทึกข้อผิดพลาด


นี่น่าจะเป็นหนึ่งหรือทั้งสองอย่างของการอนุญาต / เป็นเจ้าของต่อไปนี้ของไฟล์ที่รวมหรือตำแหน่งไฟล์ หากต้องการแก้ไขปัญหาให้ลองย้ายไฟล์ที่รวมไปยังไดเรกทอรีเดียวกันกับไฟล์ที่คุณพยายามเรียกใช้และตรวจสอบให้แน่ใจว่าผู้ใช้รายเดียวกันเป็นเจ้าของสคริปต์ที่คุณใช้งานอยู่ หากวิธีนี้แก้ไขปัญหาได้โปรดแจ้งให้เราทราบและเราจะแนะนำคุณเพิ่มเติมเกี่ยวกับการตั้งค่าการอนุญาต / การเป็นเจ้าของและการตั้งค่าพา ธ การค้นหารวม
Steve Robillard

ฉันเป็นมือใหม่ที่มี Python RPi.GPIO เป็นไฟล์จริง (อยู่ที่ไหน) \ cgi-bin \ gpio.py เป็นเจ้าของโดย pi: pi และสิทธิ์สำหรับไดเรกทอรี www คือ www-data: www-data
ทำเครื่องหมายอินแกรม

ตกลงสองสิ่งที่ไฟล์ใด ๆ ที่จำเป็นต้องใช้ในการควบคุม GPIO Pins จะต้องเรียกใช้ในฐานะ root (ซึ่งจะเปิดช่องโหว่ด้านความปลอดภัยเมื่อดำเนินการผ่านเว็บ) ต้องบอกว่าคุณจะมีเวลาง่ายขึ้นในการดีบักปัญหาใด ๆ หากคุณได้รับสคริปต์ให้ทำงานจากบรรทัดคำสั่งก่อนที่จะพยายามรับ lighttpd และ CGI เพื่อเรียกใช้เป็นราก การติดตั้งโมดูล RPi.GPIO ปฏิบัติตามคำแนะนำเหล่านี้learn.adafruit.com/... คุณมีประสบการณ์ด้านอิเล็กทรอนิกส์บ้างไหม? คุณจะทำอะไรกับพิน GPIO
Steve Robillard

1
อ่าฉันเพิ่งทดสอบสิ่งนี้และสคริปต์ง่ายๆimport RPi.GPIO as GPIOก็ต้องได้รับสิทธิ์รูท! ตอนนี้ฉันเดาว่าฉันต้องเรียกใช้ lighttpd เพื่อทำงานในฐานะ root (เป็นเพียงโครงการบ้าน)
ทำเครื่องหมายอินแกรม

1
ตรวจสอบสิ่งนี้เป็นตัวเลือกในการทำงานในฐานะ root stackoverflow.com/questions/89228/ …
Steve 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 ได้จริงเพราะต้องใช้การเข้าถึงรูท ฉันแก้ไขปัญหาโดยการเรียกgpioแอปบรรทัดคำสั่งซึ่งรวมเป็นส่วนหนึ่งของWiringPiสิ่งนี้สามารถเรียกได้จากบัญชีที่ไม่ใช่รูท

# 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 และให้สิทธิ์ผู้ใช้รูทเช่น:

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