如何在python中运行两个True语句?

时间:2017-07-05 14:16:25

标签: python raspberry-pi

我正在尝试使用Python为我的Raspberry Pi制作门刷卡系统。我将程序分为两部分:门警报和卡刷卡记录系统。这两个程序单独工作,但如何将两个程序合并为一个python文件?我尝试过线程,但它似乎没有用。

以下是节目: 1.)门警报:如果门保持打开一段时间,LED将闪烁,然后警报响起

import time
import RPi.GPIO as gpio

led = 37
buzzer = 11
door = 16

gpio.setmode(gpio.BOARD)
gpio.setwarnings(False)
gpio.setup(buzzer, gpio.OUT)
gpio.setup(led, gpio.OUT)
gpio.setup(door, gpio.IN, pull_up_down=gpio.PUD_UP)


def blink(buzzer):
    gpio.output(buzzer, True)
    time.sleep(0.1)
    gpio.output(buzzer, False)
    time.sleep(0.1)
    return

def blink(led):
    gpio.output(led, True)
    time.sleep(1)
    gpio.output(led, False)
    time.sleep(1)
    return

while True:
    if gpio.input(door):
        time.sleep(3)
        for i in range(0,5):
                blink(led)
        for i in range (0,5):
                blink(buzzer)
    else:
        gpio.output(buzzer, False)

gpio.cleanup()      

2.。)刷卡记录系统:当有人刷卡时,指示灯闪烁并拍摄照片

import datetime
import time
import os
import RPi.GPIO as gpio

led = 37
t = datetime.datetime.now()

gpio.setmode(gpio.BOARD)
gpio.setwarnings(False)
gpio.setup(led, gpio.OUT)

def blink(led):
    gpio.output(led, True)
    time.sleep(0.1)
    gpio.output(led, False)
    time.sleep(0.1)

while True:
    card = raw_input()
    f = open("Laptop Sign Out" + '.txt', 'a')
    f.write("OneCard Number: " + card[1:10] + " Time: " + t.strftime("%m-%d-%Y %H:%M:%S"))
    f.write('\n')
    f.write(';')
    f.write('\n')
    f.close()
    time.sleep(1)
    for i in range(0,3):
        blink(led)
    os.system('fswebcam ~/Desktop/Photos/%H%M%S.jpeg')
    time.sleep(3)

gpio.cleanup()

(更新)此外,下面是我尝试线程化:

import time
import RPi.GPIO as gpio
import os
import datetime
from threading import Thread

led = 37
buzzer = 11
door = 16
t = datetime.datetime.now()

gpio.setmode(gpio.BOARD)
gpio.setwarnings(False)
gpio.setup(buzzer, gpio.OUT)
gpio.setup(led, gpio.OUT)
gpio.setup(door, gpio.IN, pull_up_down=gpio.PUD_UP)


def blink(buzzer):
    gpio.output(buzzer, True)
    time.sleep(0.1)
    gpio.output(buzzer, False)
    time.sleep(0.1)
    return

def blink(led):
    gpio.output(led, True)
    time.sleep(1)
    gpio.output(led, False)
    time.sleep(1)
    return

def doorsensor():
    while True:
        if gpio.input(door):
            time.sleep(3)
            for i in range(0,5):
                    blink(led)
            for i in range (0,5):
                    blink(buzzer)
        else:
            gpio.output(buzzer, False)

def cardreader():
    while True:
        card = raw_input()
        f = open("Laptop Sign Out" + '.txt', 'a')
        f.write("OneCard Number: " + card[1:10] + " Time: " + t.strftime("%m-%d-%Y %H:%M:%S"))
        f.write('\n')
        f.write(';')
        f.write('\n')
        f.close()
        time.sleep(1)
        for i in range(0,3):
            blink(led)
        os.system('fswebcam ~/Desktop/Photos/%H%M%S.jpeg')
        time.sleep(3)

f1 = Thread(target = doorsensor())
f2 = Thread(target = cardreader())

f2.start()
f1.start()


gpio.cleanup()   

4 个答案:

答案 0 :(得分:1)

您需要将线程函数作为target参数传递,而不是它们的返回值:

import sleep

f1 = Thread(target=doorsensor) # Remove parentheses after doorsensor
f1.daemon = True
f1.start()
f2 = Thread(target=cardreader) # Remove parentheses after cardreader
f2.daemon = True
f2.start()

# Use a try block to catch Ctrl+C
try:
    # Use a while loop to keep the program from exiting and killing the threads
    while True:
        time.sleep(1.0)
except KeyboardInterrupt:
    pass

gpio.cleanup()

在每个线程上设置daemon属性,以便只剩下守护程序线程时程序将退出:

  

线程可以标记为“守护程序线程”。这个标志的意义在于,当只剩下守护进程线程时,整个Python程序都会退出。初始值继承自创建线程。可以通过守护程序属性设置标志。

答案 1 :(得分:0)

如果您尝试同时运行这两个程序,则必须使用线程或多处理,您说您已尝试过。如果您有,我们可以看到您的尝试,因为我们可能会帮助您解决您的问题。

另一个问题是你的所有方法都被命名为Blink,在python中是不允许的,在python中你的所有方法都应该有不同的名称。

修改:对于线程,请务必键入threading.Thread(target = target)作为您的代码

答案 2 :(得分:0)

我提出了一种无线方法。 我们的想法是将您的while机构转换为update个功能,并将它们交替调用。

首先,您的门环变为

def update_door():
    if gpio.input(door):
        time.sleep(3)
        for i in range(0,5):
                blink(led)
        for i in range (0,5):
                blink(buzzer)
    else:
        gpio.output(buzzer, False)

然后您的刷卡记录系统变为

def update_card():
    card = raw_input()
    f = open("Laptop Sign Out" + '.txt', 'a')
    f.write("OneCard Number: " + card[1:10] + " Time: " + t.strftime("%m-%d-%Y %H:%M:%S"))
    f.write('\n')
    f.write(';')
    f.write('\n')
    f.close()
    time.sleep(1)
    for i in range(0,3):
        blink(led)
    os.system('fswebcam ~/Desktop/Photos/%H%M%S.jpeg')
    time.sleep(3)

最后,您的主循环变为:

while True:
    update_door()
    update_card()

但是出现问题:time.sleep中的update_card也会延迟update_door。 在这里,您有三个解决方案:

1 - 如果update_door延迟,则可以

好吧,好的。

2 - 如果update_door被延迟,那就不行了,但如果update_card没有延迟就没问题

然后只需删除time.sleep(3)

3 - 您需要update_door不要延迟,update_card要延迟

然后,您可以使用time模块设置手动计时器。

lastCardUpdate = time.time()
while True:
    update_door()
    now = time.time()
    if now - lastCardUpdate >= 3:
        update_card()
        lastCardUpdate = now

raw_input中的update_card是一种阻止方法,等待用户输入。 如果确实需要每三秒钟发生一次此用户输入,则无法使用此方法。 如果你可以在while之前移动它,即在update_card函数之外移动它,那就没关系了。 否则,你确实需要使用线程。

答案 3 :(得分:0)

无论其他任何错误,您都需要在启动后加入其中一个主题。

f1 = Thread(target = doorsensor())
f2 = Thread(target = cardreader())

f2.start()
f1.start()

f1.join()

f1.join()做了什么?

基本上,它告诉Python等到f1完成运行。 如果您不这样做,程序将启动f1f2,然后退出。 退出后,Python将释放所有资源,包括那两个执行将停止的线程。