Python 2.7 на raspberry pi 3 os. системные вызовы блокируют прерывания?

Я новичок в python (хотя и не новичок в программировании и ИТ в целом), поэтому, пожалуйста, простите меня, если я собираюсь спросить что-то тривиальное ...

У меня следующая установка:

  • Raspberry PI 3 с запущенным на нем дистрибутивом Wheezy Raspbian (по крайней мере, я думаю, это изображение PiMusicBox с сайта pimusicbox.com, должно быть Wheezy на основе того, что я красил в документации). Версия Python - 2.7.3.
  • a mechanical rotary encoder connected as follows (pin numbers are referred to BOARD pins):
    • Ground to ground pin 39 (ground, this is easy :-) )
    • «+» к контакту 1 (3,3 В, еще один простой)
    • dt к выводу 13
    • clk к контакту 15

Поведение следующего фрагмента кода для меня не совсем объяснимо (я полагаю, не зависит от конкретного типа ввода):

import os
import RPi.GPIO as GPIO
import time

TunerDtPin = 13    #  dt pin
TunerClkPin = 15    #  clk pin

last_state=0

def setup():
    GPIO.setmode(GPIO.BOARD)    
    GPIO.setup(TunerDtPin, GPIO.IN,pull_up_down=GPIO.PUD_UP)    
    GPIO.setup(TunerClkPin, GPIO.IN,pull_up_down=GPIO.PUD_UP)
    GPIO.add_event_detect(TunerClkPin, GPIO.BOTH, callback=rotary_callback) 

def rotary_callback(pin):
    global last_state
    sig = GPIO.input(TunerDtPin)
    clk = GPIO.input(TunerClkPin)
    if (clk and clk!=last_state):
        if(clk!=sig): 
            print 1
        else: 
            print -1
    last_state=clk

def destroy():
    GPIO.cleanup()             # Release resource   

if __name__ == '__main__':     # Program start from here
    setup()
    try:
        while True:
            os.system("uptime")
            time.sleep(10)
    except KeyboardInterrupt:  
        destroy()

Функция обратного вызова НИКОГДА не вызывается ... сценарий просто продолжает распечатывать выходные данные вызова 'uptime' каждые десять секунд.

НО, если не указывать системный вызов в скрипте (достаточно комментировать строку), все работает как чарм, печатающий «1» или «-1», в зависимости от направления вращения, для каждого шага кодировщика ... я не хватает чего-то очевидного?


person Michele Borioli    schedule 03.02.2018    source источник


Ответы (1)


Хорошо, похоже, я недостаточно искал в документации ....

Модуль подпроцесса существует уже давно ... https://docs.python.org/2/library/subprocess.html

Замена os.system("uptime") на subprocess.call("uptime") сделала свое дело.

person Michele Borioli    schedule 03.02.2018