Как обрабатывать несколько скриптов / процессов, работающих в Python - PullRequest
0 голосов
/ 03 ноября 2019

Итак, на высоком уровне я написал скрипт на python, который содержит цикл для проверки сервиса простой очереди amazon на наличие навыка, созданного мной для Alexa, который при вызове отправляет сообщение в очередь. Мой сценарий проверяет очередь снова и снова в течение 60 секунд, и когда он находит правильную инструкцию в очереди, он вызывает мой сценарий для отображения некоторых сообщений на светодиодной матрице, которую выполняет мой raspberry pi. Все это прекрасно работает, Alexa понимает мою голосовую команду, светодиодная матрица включается, счастливые дни.

Но есть проблема с инструкцией по ее отключению. Как и выше, когда я хочу отключить его, Alexa понимает команду, она отправляется в очередь, и мой скрипт для проверки очереди распознает инструкцию, пытается завершить процесс, который запускает матрицу светодиодов. Проблема, однако, в том, что процесс не погибает. Из того, что я могу сказать, он продолжает запускать матрицу светодиодов до тех пор, пока я не уничтожу ее вручную, и только в этот момент сценарий, проверяющий очередь, возвращается к жизни и запускает команду kill process, но, очевидно, ничего не происходит, когда ямы уже вручную убили процесс в командной строке.

Я довольно новичок в Python (и программирование действительно!), поэтому я думаю, что это как-то связано с тем, как я обрабатываю несколько сценариев Python /несколько процессов одновременно, и я не понимаю механику более низкого уровня того, как python управляет процессами ... возможно, немного выше моего уровня квалификации. Но я понятия не имею, как это сделать, не помещая весь код матрицы светодиодов в тот же сценарий, который проверяет очередь. Сценарий светодиодной матрицы состоит из сотен строк с множеством различных функций, поэтому неправильно совмещать эти два разных сценария, которые имеют разные цели, и это будет грязно.

Я разместил код проверки очереди ниже, а не код светодиодной матрицы, но могу опубликовать это, если это поможет. Любая помощь, которую может предложить каждый, очень ценится! Даже если это просто для того, чтобы помочь мне правильно выбрать Google!

Я также добавил ссылку на скриншот вывода терминала для отладки

Вывод терминаладля отладки


import boto3
import os, signal
import time
import subprocess

access_key = my key
access_secret =  my secret
region ="us-east-2"
queue_url = "https://sqs.us-east-2.amazonaws.com/486141425281/alexa-rpi-queue"

def pop_message(client, url):
    response = client.receive_message(QueueUrl = url, MaxNumberOfMessages = 10)

    #last message posted becomes messages
    message = response['Messages'][0]['Body']
    receipt = response['Messages'][0]['ReceiptHandle']
    client.delete_message(QueueUrl = url, ReceiptHandle = receipt)
    return message

client = boto3.client('sqs', aws_access_key_id = access_key, aws_secret_access_key = access_secret, region_name = region)

waittime = 20
client.set_queue_attributes(QueueUrl = queue_url, Attributes = {'ReceiveMessageWaitTimeSeconds': str(waittime)})

time_start = time.time()
while (time.time() - time_start < 60):
        print("Checking...")
        try:
                message = pop_message(client, queue_url)
                print(message)
                if message == "on":
                        subprocess.call(["python","/home/pi/rpi-rgb-led-matrix/bindings/python/trainsign/tube-sign-refactor.py", "--led-gpio-mapping=adafruit-hat", "--led-cols=128", "-r=64", "--led-brightness=65"])

                elif message == "off":
                        f2 = open('/home/pi/rpi-rgb-led-matrix/bindings/python/trainsign/pid2.py', 'r')
                        print("opened PID file")
                        pid2 = f2.read()
                        print("successfully read PID")
                        print(pid2)
                        os.kill(int(pid2), signal.SIGKILL)
                        print("successfully killed process")
                        sys.exit()
                        print("sucessfully exited process")
        except:
                pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...