Làm cách nào để đưa RPi.GPIO vào tập lệnh CGI python với lighttpd?


13

Gần đây tôi đã thiết lập python để làm việc với lighttpd thông qua CGI (xem tại đây ). Nhưng ngay khi tôi đưa vào RPi.GPIO , tập lệnh dừng thực thi (Tôi giả sử vì không có HTML nào được xuất), nhưng không có lỗi xuất ra trong nhật ký lỗi ( /var/log/lighttpd/error.log).

gpio

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

Tại sao kịch bản không được thực thi? Có phải vì quyền? Chắc chắn, bao gồm cả thư viện không cần bất kỳ quyền đặc biệt? Tại sao không có bất kỳ đầu ra lỗi nào trong tập lệnh hoặc trong nhật ký lỗi?


Đây có thể là một hoặc cả hai quyền / quyền sở hữu sau của tệp được bao gồm hoặc vị trí tệp. Để khắc phục sự cố, hãy thử di chuyển tệp được bao gồm vào cùng thư mục với tệp bạn đang cố chạy và đảm bảo rằng nó thuộc sở hữu của cùng một người dùng với tập lệnh bạn đang chạy. Nếu điều này giải quyết được vấn đề, hãy cho chúng tôi biết và chúng tôi có thể hướng dẫn bạn thêm về việc đặt quyền / quyền sở hữu và đặt đường dẫn tìm kiếm bao gồm.
Steve Robillard

Tôi là người mới sử dụng Python, RPi.GPIO có phải là tệp thực sự không (ở đâu)? \ cgi-bin \ gpio.py được sở hữu bởi pi: pi và các quyền cho thư mục www là www-data: www-data.
Đánh dấu Ingram

OK, một vài điều mà bất kỳ tệp nào cần kiểm soát GPIO Pins sẽ cần chạy dưới quyền root (sẽ mở một lỗ hổng bảo mật khi được thực hiện thông qua web). Đã nói rằng bạn sẽ có một thời gian dễ dàng hơn để gỡ lỗi bất kỳ vấn đề nào nếu bạn làm cho tập lệnh hoạt động từ dòng lệnh trước khi cố gắng để lighttpd và CGI chạy bằng root. Để cài đặt Mô-đun RPi.GPIO, hãy làm theo các hướng dẫn sau khi tìm hiểu.adafbean.com/ . Bạn có bất kỳ kinh nghiệm điện tử? Bạn sẽ làm gì với các chân GPIO
Steve Robillard

1
À, tôi vừa mới thử cái này, và một đoạn script đơn giản import RPi.GPIO as GPIOthực sự đòi hỏi quyền root! Bây giờ tôi đoán tôi cần phải có lighttpd để chạy bằng root (nó chỉ là một dự án gia đình).
Đánh dấu Ingram

1
kiểm tra này như là một tùy chọn để chạy bằng root stackoverflow.com/questions/89228/...
Steve Robillard

Câu trả lời:


6

Bạn có thể thử thêm trước khi 'nhập RPi.GPIO':

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

Nó có thể giúp chẩn đoán lỗi.

Và thêm các dòng này trước đầu ra html của bạn:

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

Xem http://docs.python.org/l Library / cgi.html


6

Sau khi làm theo lời khuyên từ okertanov, tôi phát hiện ra rằng bạn thực sự không thể sử dụng RPi.GPIOtrong tập lệnh CGI python vì nó yêu cầu quyền truy cập root. Tôi đã giải quyết vấn đề bằng cách gọi ra gpioứng dụng dòng lệnh được bao gồm như một phần của WiresPi , điều này có thể được gọi từ một tài khoản không 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

0

# có nghĩa là một nhận xét trong Python

Chỉ dùng

import RPi.GPIO as GPIO

Bây giờ bạn sẽ cần giải quyết vấn đề quyền


Xin lỗi đó là lỗi của tôi, tôi đã sao chép mã của mình có dòng đó nhận xét. Tôi đã xóa nó khỏi câu hỏi ban đầu.
Đánh dấu Ingram

0

Hướng dẫn này khuyên bạn nên tạo một bản sao đặc biệt của Python và cung cấp cho nó quyền người dùng root, như vậy:

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

Và sau đó, để tạo CGI của bạn, hãy đi sudo nano /etc/lighttpd/lighttpd.confvà tìm bất cứ nơi nào bạn đang hướng .pycác tệp từ và thay đổi /usr/bin/python/thành /usr/bin/pythonRoot/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.