Python 每5分钟独立于其他命令运行一部分代码

Python 每5分钟独立于其他命令运行一部分代码,python,raspberry-pi3,Python,Raspberry Pi3,我想打开,保持打开6秒,每5分钟关闭一个继电器,而其余代码正常运行 例如: GPIO.output(18, 1) sleep(6) GPIO.output(18, 0) sleep(300) 但是在这个延迟中没有rest程序堆栈。我的Python代码是: import RPi.GPIO as GPIO from time import sleep GPIO.setmode(GPIO.BOARD) GPIO.setup(13, GPIO.IN, GPIO.PUD_UP) GPIO.setup(

我想打开,保持打开6秒,每5分钟关闭一个继电器,而其余代码正常运行

例如:

GPIO.output(18, 1)
sleep(6)
GPIO.output(18, 0)
sleep(300)
但是在这个延迟中没有rest程序堆栈。我的Python代码是:

import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BOARD)
GPIO.setup(13, GPIO.IN, GPIO.PUD_UP)
GPIO.setup(7,GPIO.OUT)
GPIO.setup(37, GPIO.OUT)
Hologram = '/home/pi/Hologram/Hologram.mp4'

from subprocess import Popen

firstTimeOpen=0

while True:

        doorIsOpen = GPIO.input(13)

        if doorIsOpen==0 and firstTimeOpen == 0:
                        firstTimeOpen=1
                        GPIO.output(7, 0)
                        GPIO.output(37, 0)
                        sleep(0.5)

        if doorIsOpen==1 and firstTimeOpen == 1:
                GPIO.output(7, 1)
                GPIO.output(37, 1)
                omxp = Popen(['omxplayer' ,Hologram])
                sleep(87)
                GPIO.output(7, 0)
                GPIO.output(37, 0)
                firstTimeOpen=0
                sleep(0.5)

您可以将此逻辑放在不同的线程中。将停止冻结您的程序,并且不会影响其工作流程

线程提供了一种方便的方法。我通常创建一个
threading.Thread
子类,它的
run
方法是在单独的线程中运行的代码。所以你会想要一些类似的东西:

class BackgroundRunner(threading.thread):
    def run(self):
        while True:
            GPIO.output(18, 1)
            sleep(6)
            GPIO.output(18, 0)
            sleep(300)
然后,在开始运行主代码之前,使用

bg_runner = BackgroundRunner()
bg_runner.start()

除了建议的线程方法外,还可以使用python信号模块使用中断。中断比线程便宜,线程可能更适合您选择的平台

您可以在此处找到更多示例:

例如:

import signal, os

def handler(signum, frame):
    print 'Signal handler called with signal', signum
    handler.counter += 1

    if not handler.counter % (300 / 6):
        GPIO.output(18, 0)
    else:
        GPIO.output(18, 1)

handler.counter = 0

signal.signal(signal.ITIMER_REAL, handler)
signal.setitimer(signal.ITIMER_REAL, 0, 6)

这并不能回答这个问题。一旦你赢得了足够的声誉,你就可以对任何帖子发表评论。相反,提供不需要提问者澄清的答案。不幸的是,我是Python新手,我不知道如何才能做到这一点。你能告诉我之后代码是如何形成的吗?我上面的答案表示非常抱歉没有为代码提供答案。我当时无法写这篇文章,这是一个非常直截了当的问题。如果你通过谷歌搜索和你的代码,你会自己找到答案。下次请小心,先自己试试。signal.signal(signal.ITIMER\u REAL,handler)value错误:信号号超出范围