나는 라스베리 파이에 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()
감사 조
왜 여기에 'exec'를 가져 오나요? 왜 단지'글로벌 varname이 아닌가? varname = value'? 전역 적()에서 무엇을 의미 했습니까? – Kos
1. exec()가 잘못 사용되었습니다. 2. exec()는이 경우 도움이되지 않습니다. – jfs
Kos,'글로벌 varname; varname = value' 변수의 로컬 복사본을 만들고 변경하면 모든 전역 변수가 전역 변수에 저장됩니다. – MichaelvdNet