1

RaspberryPiでRaspbianを使用しています。スーパーバイザーを使用してサービスとして実行されているLCDを制御するPythonスクリプト(LCD.py)があります。

Webページにメッセージを入力してLCDに表示させたいのですが。これは、LCD.pyスクリプトが読み取るいくつかの変数を変更する必要があることを意味すると思います。おそらく、モードを変更するためのフラグを変更してから、サーバーによって実行される別のPythonスクリプト(CGI.py)を使用してメッセージ自体を変更する必要があります。

これを行うための最良の方法は何ですか?それとも私は完全に異なることをするべきですか?ページの読み込みごとにスクリプトを実行することはできず、バックグラウンドで実行する必要があるため、通常のCGIタイプのものとは異なると思います(スクロール、フラッシュなど)

編集:これまでのところあなたの助けに感謝します、私は家に帰った今夜私のLCDデーモンコードを投稿します。

私はこれについてもう少し進んでいます。SimpleXMLRPCServerとスレッドを使用しようとしましたが、現在これは機能しません。スレッドは実際には同時に実行されないためだと思います。これは私がテストしていた私のサーバーコードです:

    from SimpleXMLRPCServer import SimpleXMLRPCServer
    from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler
    import threading
    import time

    globalMessage = "Hi, I havnt been changed!"

    # Restrict to a particular path.
    class RequestHandler(SimpleXMLRPCRequestHandler):
        rpc_paths = ('/RPC2',)

    # Create server
    server = SimpleXMLRPCServer(("localhost", 8000),
                                requestHandler=RequestHandler)
    server.register_introspection_functions()

    # Register an instance; all the methods of the instance are
    # published as XML-RPC methods (in this case, just 'div').
    class serverFunctions:
        def setMessage(self, message):
                global globalMessage
                globalMessage = message
                print(globalMessage)


    class serverThread(threading.Thread):
            def run(self):
                    server.register_instance(serverFunctions())

                    # Run the server's main loop
                    server.serve_forever()
                    print("test");

    class lcdThread(threading.Thread):
            def run(self):
                    global globalMessage
                    while(1):
                            oldMessage = globalMessage
                            if(oldMessage != globalMessage): print("Message has changed")
                            else: print ("Message has not changed")
                            print(globalMessage)
                            time.sleep(1)

    serverThread().start()
    #lcdThread().start()

と私のクライアントコード:

import xmlrpclib

s = xmlrpclib.ServerProxy('http://localhost:8000')


print s.setMessage("hello world")

lcdThread()。start()行のコメントを外すと、lcd whileループでスタックし、サーバーが応答していないと思います。マルチプロセッシングは何か違いがありますか?exec()関数について詳しく教えてください。exec()を使用して別のスクリプトのグローバル変数を変更するにはどうすればよいですか?

編集:これがデーモンである私のLCD.pyコードです、設定しようとしているメッセージ変数imは約半分下にあります。

#!/usr/bin/python
from Adafruit_CharLCD import Adafruit_CharLCD
from subprocess import * 
from time import sleep, strftime
from datetime import datetime
from datetime import timedelta
from os import system
from os import getloadavg
from glob import glob
import RPi.GPIO as GPIO

#Variables
lcd = Adafruit_CharLCD() #Stores LCD object
cmdIP = "ip addr show eth0 | grep inet | awk '{print $2}' | cut -d/ -f1" #Current IP
cmdHD = "df -h /dev/sda1 | awk '{print $5}'" # Available hd space
cmdSD = "df -h / | awk '{print $5}'" # Available sd space
cmdRam = "free -h"
temp = 0

#Run shell command
def run_cmd(cmd):
    p = Popen(cmd, shell=True, stdout=PIPE)
    output = p.communicate()[0]
    return output

#Initalises temp device     
def initialise_temp():
    #Initialise
    system("sudo modprobe w1-gpio")
    system("sudo modprobe w1-therm")
    #Find device
    devicedir = glob("/sys/bus/w1/devices/28-*")
    device = devicedir[0]+"/w1_slave"
    return device

#Gets temp  
def get_temp(device):
    f = open (device, 'r')
    sensor = f.readlines()
    f.close()

    #parse results from the file
    crc=sensor[0].split()[-1]
    temp=float(sensor[1].split()[-1].strip('t='))
    temp_C=(temp/1000.000)
    temp_F = ( temp_C * 9.0 / 5.0 ) + 32

    #output
    return temp_C

#Gets time
def get_time():
    return datetime.now().strftime('%b %d  %H:%M:%S\n')

#Gets uptime
def get_uptime():
    with open('/proc/uptime', 'r') as f:
        seconds = float(f.readline().split()[0])
        array = str(timedelta(seconds = seconds)).split('.')
        string = array[0]
    return string

#Gets average load
def get_load():
    array = getloadavg()
    average = 0
    for i in array:
        average += i
    average = average / 3
    average = average * 100
    average = "%.f" % average
    return str(average + "%")

#def get_ram():
def get_ram():
    ram = run_cmd(cmdRam)
    strippedRam = ram.replace("\n"," ");
    splitRam = strippedRam.split(' ')
    totalRam = int(splitRam[52].rstrip("M"))
    usedRam = int(splitRam[59].rstrip("M"))
    percentage = "%.f" % ((float(usedRam) / float(totalRam)) * 100)
    return percentage + "%"

#Gets the SD usage
def get_sd():
    sd = run_cmd(cmdSD)
    strippedSD = sd.lstrip("Use%\n")
    return strippedSD

#Gets the HD usage
def get_hd():
    hd = run_cmd(cmdHD)
    strippedHD = hd.lstrip("Use%\n")
    return strippedHD

#This is the variable im trying to set  
#def get_message():
#   message = "hello"
#   return message

def scroll():
    while(1):
        lcd.scrollDisplayLeft()
        sleep(0.5)

#Message and IP - PERFECT
def screen1():
    ipaddr = run_cmd(cmdIP)
    lcd.message('Raspberry Pi\n')
    lcd.message('IP: %s' % (ipaddr))

#Uptime - tick
def screen2():
    uptime = get_uptime()
    lcd.message('Total Uptime\n') 
    lcd.message('%s' % (uptime))

#Ram and load - PERFECT
def screen3():
    ram = get_ram()
    lcd.message('Ram Used: %s\n' % (ram))
    load = get_load()
    lcd.message('Avg Load: %s' % (load))

#Temp and time - tick time
def screen4():
    time = get_time();
    lcd.message('Temp %s\n' % (temp))
    lcd.message('%s' % (time))

#HD and SD usage - PERFECT
def screen5():
    sd = get_sd()
    lcd.message('SD Used: %s\n' % (sd))
    hd = get_hd()
    lcd.message('HD Used: %s' % (hd))

#Web message    
#def screen6():
#   message = get_message()
#   lcd.message(message)

#Pause and clear
def screenPause(time):
    sleep(time)
    #In here to reduce lag
    global temp
    temp = str(get_temp(device));
    lcd.clear()
###########################################################################################################

try:
    #Initialise
    lcd.begin(16,2)
    device = initialise_temp()
    lcd.clear()

    #Main loop
    while(1):
        screen1()
        screenPause(5)
        screen2()
        screenPause(5)
        screen3()
        screenPause(5)
        screen5()
        screenPause(5)
        screen4()
        screenPause(5)

except KeyboardInterrupt:
    GPIO.cleanup()

ありがとうジョー

4

2 に答える 2

1

スクリプトの実行中にグローバル変数を変更する方法を探している場合は、

exec("<varname> = <newvar> in globals()")

コメントに載せないと。

編集:既存のコードを含める可能性があります

于 2012-12-29T10:38:21.593 に答える
0

LCD.py デーモンにコマンドを送信する必要がある場合。http プロトコルを使用してそれを行うこともできます。ボトルのようなものを試して、Web アプリ パーツを実装できます。

Web アプリケーションを別のデーモンとして実行できますが、とにかく LCD.pyに何らかの形式のIPCを実装する必要があります。

于 2012-12-29T19:48:40.283 に答える