2012-12-29 3 views
1

나는 라스베리 파이에 Raspbian을 사용하고 있습니다. supervisord를 사용하여 서비스로 실행되는 LCD를 제어하는 ​​Python 스크립트 (LCD.py)가 있습니다.실행중인 Python 스크립트/서비스에서 웹 페이지의 변수를 변경하는 방법은 무엇입니까?

내 웹 페이지에 메시지를 입력하고 LCD에 표시하고 싶습니다. 이 말은 내 LCD.py 스크립트가 읽는 변수들, 아마도 모드를 바꾸는 플래그, 그리고 내 서버가 실행하는 다른 Python 스크립트 (CGI.py)를 사용하는 메시지 자체를 변경해야한다는 것을 의미한다고 생각합니다.

이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 아니면 완전히 다른 것을해야합니까? 스크립트가 각 페이지로드시 실행될 수 없기 때문에 백그라운드에서 실행해야합니다 (스크롤, 깜박임 등)

EDIT : 지금까지 도와 주셔서 감사합니다. 나는 집에 도착했을 때 오늘 밤 LCD 데몬 코드를 게시 할 것이다.

나는 조금 더있어, 내가 SimpleXMLRPCServer 및 스레드를 사용하려고, 현재이 dosn't 작동합니다. 나는 스레드가 실제로 동시에 실행되지 않기 때문에 그것을 생각합니다. 나는 그것이에 갇히지 생각

import xmlrpclib 

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


print s.setMessage("hello world") 

내 lcdThread()를 언급 I 않은 경우 (시작) 라인 :

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() 

내 클라이언트 코드 :.이 내가 함께 테스트 된 내 서버 코드 lcd while 루프와 서버가 응답하지 않습니다. 멀티 프로세싱이 어떤 변화를 가져올 것입니까? exec() 함수에 대해 자세히 설명해주십시오. exec()를 사용하여 다른 스크립트에서 전역 변수를 변경하는 방법은 무엇입니까?

EDIT : 여기 내 데몬 인 LCD.py 코드입니다. 설정하려고하는 메시지 변수는 약 절반 정도입니다. 당신은 코멘트를 게시하지 않는 경우

#!/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() 

감사 조

답변

1

스크립트가 실행되는 동안 글로벌 변수를 변경하는 방법을 찾고 있다면,

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

.

편집 : 당신이 LCD.py 데몬에 명령을 전송해야하는 경우 아마 어떤 excisting 코드

+0

왜 여기에 'exec'를 가져 오나요? 왜 단지'글로벌 varname이 아닌가? varname = value'? 전역 적()에서 무엇을 의미 했습니까? – Kos

+0

1. exec()가 잘못 사용되었습니다. 2. exec()는이 경우 도움이되지 않습니다. – jfs

+0

Kos,'글로벌 varname; varname = value' 변수의 로컬 복사본을 만들고 변경하면 모든 전역 변수가 전역 변수에 저장됩니다. – MichaelvdNet

0

을 포함한다; 당신은 http 프로토콜을 사용하여 그렇게 할 수 있습니다. bottle과 같은 것을 시도해 웹 앱 부분을 구현할 수 있습니다.

웹 응용 프로그램을 별도의 데몬으로 실행할 수 있지만 LCD.py에 어떤 형태로든 IPC을 구현해야합니다.