Подпроцесс всегда автоматически запускается при запуске скрипта python - PullRequest
0 голосов
/ 23 февраля 2020

Я пытаюсь создать скрипт python, который запускает mdk3, когда переключатель включен (НИЗКИЙ), и убивает его, когда он выключен (ВЫСОКИЙ). Однако команда mdk3 всегда запускается при запуске скрипта, независимо от положения переключателя. Запуск сценария с переключателем в положении ON, а затем его выключение во время работы убивает команду, как и ожидалось. Тем не менее, он не запускается снова при повторном включении. Интересно, что текст, настроенный для печати, работает точно так, как и следовало ожидать. Мой код выглядит следующим образом:

import RPi.GPIO as GPIO
import time
import subprocess
import os
import signal

FSU = 'sudo mdk3 mon0 d'

pro = 'subprocess.Popen(FSU, stdout=subprocess.PIPE, shell=True, preexec_fn=os.setsid)'



# tell the GPIO module that we want to use the chip's numbering scheme
GPIO.setmode(GPIO.BCM)

# Set up GPIO16 as an input with internal pull-up resistor to hold it HIGH until it is pulled down to GND by the connected switch
GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_UP)

running = False

while True:
    if GPIO.input(16) == GPIO.LOW:
        if running == False:
            print('Button was pushed!')
            pro
            running = True
            time.sleep(0.1)
        elif running == True:
            print('The process is running.')
            time.sleep(0.1)
    elif GPIO.input(16) == GPIO.HIGH and running == True:
        os.killpg(os.getpgid(pro.pid), signal.SIGTERM)
        print('Process killed.')
        running = False
        time.sleep(0.1)
    elif running == False:
        print('The process is not running.')
        time.sleep(0.1)
    else:
        print('Critical error.')
time.sleep(0.1)

Причина, по которой я использую свой собственный l oop для опроса выводов GPIO вместо встроенного в библиотеку RPi.GPIO обнаружения событий, заключается в том, что не вызывало у меня ничего, кроме проблем, и делать это самому казалось проще. Буду признателен за любую помощь.

Редактировать: Я не уверен, почему я не думал о том, чтобы поместить этот вызов в кавычки. Теперь он не запускается при запуске скрипта, а запускается только один раз. Как в: я запускаю скрипт с выключенным выключателем, и он не запускается (как и ожидалось). Я включаю его, и он работает. Я выключаю его снова, и он успешно убивает скрипт. Однако его включение не перезапускает скрипт. Извините, если это плохое объяснение.

1 Ответ

0 голосов
/ 23 февраля 2020

subprocess.Popen() запускает процесс, как только он вызывается, а также возвращает процесс.
Итак, вы можете просто запустить процесс снова в l oop, когда он должен быть запущен, снова вызвав ту же функцию.

Немного изменив свой код:

import RPi.GPIO as GPIO
import time
import subprocess
import os
import signal

proc = subprocess.Popen(FSU, stdout=subprocess.PIPE, shell=True, preexec_fn=os.setsid)

FSU = 'sudo mdk3 mon0 d'

# tell the GPIO module that we want to use the chip's numbering scheme
GPIO.setmode(GPIO.BCM)

# Set up GPIO16 as an input with internal pull-up resistor to hold it HIGH until it is pulled down to GND by the connected switch
GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_UP)

running = False

while True:
    if GPIO.input(16) == GPIO.LOW:
        if running == False:
            print('Button was pushed!')
            # declare the proc variabe again and also start the process
            proc = subprocess.Popen(FSU, stdout=subprocess.PIPE, shell=True, preexec_fn=os.setsid)
            running = True
            time.sleep(0.1)
        elif running == True:
            print('The process is running.')
            time.sleep(0.1)
    elif GPIO.input(16) == GPIO.HIGH and running == True:
        os.killpg(os.getpgid(pro.pid), signal.SIGTERM)
        print('Process killed.')
        running = False
        time.sleep(0.1)
    elif running == False:
        print('The process is not running.')
        time.sleep(0.1)
    else:
        print('Critical error.')
time.sleep(0.1)

Подробнее о подпроцессе

...