我正在使用python 2.7.3 我有几个课程:
class GpioSettings:
class GpioSettings(object):
__initialized__ = False
PIR_PIN = 6
GPIO = None
RISING = None
FALLING = None
IN = None
def __init__(self):
print "starting to initialize gpio settings"
if GpioSettings.__initialized__:
print "gpio settings already initialized now"
return
else:
print "initializing gpio settings now"
GpioSettings.__initialized__ = True
try:
import RPi.GPIO as GPIO
GpioSettings.GPIO = GPIO
GpioSettings.RISING = GPIO.RISING
GpioSettings.FALLING = GPIO.FALLING
GpioSettings.IN = GPIO.IN
GPIO.setmode(GPIO.BCM)
GpioSettings.__piFunctionsLoaded__ = True
except:
GpioSettings.__piFunctionsLoaded__ = False
@staticmethod
def piFunctionsLoaded():
return GpioSettings.__piFunctionsLoaded__
@staticmethod
def gpio():
return GpioSettings.GPIO
班Pir:
import os
import sys
import time
sys.path.append(os.path.abspath("/home/pi/garageMonitor/django/lib"))
from gpioSettings import GpioSettings
from osUtils import checkUser
class Pir(object):
def __init__(self, callback):
self.gpio = GpioSettings()
if not self.gpio.piFunctionsLoaded():
return
self.gpio.gpio().setup(self.gpio.PIR_PIN, gpio.IN)
self.gpio.gpio().add_event_detect(self.gpio.PIR_PIN, gpio.RISING, callback=callback, bouncetime=300)
def testCallback(channel):
print "Motion Detected on " + str(channel)
if __name__ == "__main__":
checkUser()
gpio = GpioSettings()
if gpio.piFunctionsLoaded():
print "loaded"
pir = Pir(testCallback)
time.sleep(30)
else:
print "not loaded"
和python文件startPio.py:
import os
import sys
sys.path.append(os.path.abspath("/home/pi/garageMonitor/django/lib"))
from gpioSettings import GpioSettings
from osUtils import checkUser
from piPir import Pir
def pirCallback(channel):
print "Motion Detected on " + str(channel)
if __name__ == "__main__":
checkUser()
print "initializing gpio now"
gpio = GpioSettings()
if gpio.piFunctionsLoaded():
print "loaded here"
pir = Pir(pirCallback)
else:
print "not loaded"
我正在尝试创建GpioSettings类的单例,以便我可以在多个类中使用它。它可能没有在适当的硬件上运行(并且RPi.GPIO可能不可用)所以我试图将其与其他类屏蔽。
如果我跑: sudo python ./piPir.py它工作正常(调用GpioSettings),我得到了预期的输出:
starting to initialize gpio settings
initializing gpio settings now
gpio settings already initialized now
loaded
starging to initialize gpio settings
gpio settings already initialized now
Motion Detected on 6
如果我跑: sudo python ./startPio.py(调用GpioSettings和piPir)我得到以下内容:
sudo python ./startPio.py
initializing gpio now
loaded here
Traceback (most recent call last):
File "./startPio.py", line 17, in <module>
pir = Pir(pirCallback)
File "/home/pi/garageMonitor/django/lib/piPir.py", line 13, in __init__
self.gpio.gpio().setup(self.gpio.PIR_PIN, gpio.IN)
AttributeError: GpioSettings instance has no attribute 'gpio'
当从startPio.py调用“gpio = GpioSettings()”时,杀死我的是“开始初始化gpio设置”不会被打印出来。
显然我很累,需要休息,因为我确信这很明显。
因此,我将所有内容放在一个文件中,以使调试更容易:
class GpioSettings(object):
__initialized__ = False
PIR_PIN = 6
GPIO = None
RISING = None
FALLING = None
IN = None
def __init__(self):
print "starting to initialize gpio settings"
if GpioSettings.__initialized__:
print "gpio settings already initialized now"
return
else:
print "initializing gpio settings now"
GpioSettings.__initialized__ = True
try:
import RPi.GPIO as GPIO
GpioSettings.GPIO = GPIO
GpioSettings.RISING = GPIO.RISING
GpioSettings.FALLING = GPIO.FALLING
GpioSettings.IN = GPIO.IN
GPIO.setmode(GPIO.BCM)
GpioSettings.__piFunctionsLoaded__ = True
except:
GpioSettings.__piFunctionsLoaded__ = False
@staticmethod
def piFunctionsLoaded():
return GpioSettings.__piFunctionsLoaded__
@staticmethod
def gpio():
return GpioSettings.GPIO
##############################################################################
##############################################################################
##############################################################################
class Pir(object):
def __init__(self, callback):
print "intializing PIR"
self.gpio = GpioSettings()
if not self.gpio.piFunctionsLoaded():
return
self.gpio.gpio().setup(self.gpio.PIR_PIN, gpio.IN)
self.gpio.gpio().add_event_detect(self.gpio.PIR_PIN, gpio.RISING, callback=callback, bouncetime=300)
##############################################################################
##############################################################################
##############################################################################
import os
import sys
sys.path.append(os.path.abspath("/home/pi/garageMonitor/django/lib"))
#from gpioSettings import GpioSettings
from osUtils import checkUser
#from piPir import Pir
def pirCallback(channel):
print "Motion Detected on " + str(channel)
if __name__ == "__main__":
checkUser()
print "initializing gpio now"
gpio = GpioSettings()
if gpio.piFunctionsLoaded():
print "loaded here"
pir = Pir(pirCallback)
else:
print "not loaded"
它工作正常!! ?? !!!
sudo python startPio.py
initializing gpio now
starting to initialize gpio settings
initializing gpio settings now
loaded here
intializing PIR
starting to initialize gpio settings
gpio settings already initialized now
答案 0 :(得分:1)
我放弃了。感谢Corley Brigman,以下是我的最新动态:
piPir.py:
import os
import sys
sys.path.append(os.path.abspath("/home/pi/garageMonitor/django/lib"))
import gpioSettings
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
class Pir(object):
def __init__(self, callback):
GPIO.setup(gpioSettings.PIR_PIN, GPIO.IN)
GPIO.add_event_detect(gpioSettings.PIR_PIN, GPIO.RISING, callback=callback, bouncetime=300)
gpioSettings.py:
PIR_PIN = 6
DOOR_UP_PIN = 21
DOOR_DOWN_PIN = 22
gpioStart.py:
import os
import sys
import time
sys.path.append(os.path.abspath("/home/pi/garageMonitor/django/lib"))
from osUtils import checkUser
from piPir import Pir
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
def pirCallback(channel):
print "Motion Detected on " + str(channel)
if __name__ == "__main__":
checkUser()
pir = Pir(pirCallback)
time.sleep(30000)