Neuroware
@Neuroware
Программист в свободное от работы время

Есть ли нормальные глобальные объекты в python?

Предистория: есть pi на котором крутится скрипт на питоне и ждет данных по serial, когда получает команду чтото делает, к примеру 2 нужных функции- включить и выключить определенный трек в omxplayer. Все бы ничего, но нужно сделать плавный переход между треками, а это уже отсутствует в функционале плеера. Нашел костыльное решение в виде wrapper для этого плеера, в нем создается объект такого вида player=OMXPlayer(filename) по которому дается команда player.play и др.
Сам скрипт построен как куча elif (команда)
И проблема в том, что если запустить плеер в одном из таких if то его не видно из другого, параметр global ничего не меняет, говорит мол нет такого объекта
весь скрипт крутится в while(true) одного def. Подозреваю что проблема связана с тем, что global объекты обновляются только после выхода из def, но не факт. Что можно сделать в данной ситуации?
p.s. сам в питоне провел только пару часов, поэтому много в нем не знаю

код
#!/usr/bin/python
import serial, time, os, sys
from omxplayer import OMXPlayer
ser = serial.Serial ()
try:
    ser = serial.Serial(
        port='/dev/ttyACM0',
        baudrate = 115200,
        timeout=1
    )
    print 'ttyACM0'
except:
    try:
        ser = serial.Serial(
            port='/dev/ttyACM1',
            baudrate = 115200,
            timeout=1
        )
        print 'ttyACM1'
    except:
        try:
            ser = serial.Serial(
                baudrate = 115200,
                port='/dev/ttyACM2',
                timeout=1
            )
            print 'ttyACM2'
        except:
            try:
                ser = serial.Serial(
                    baudrate = 115200,
                    port='/dev/ttyUSB0',
                    timeout=1
                )
                print 'ttyUSB0'
            except:
                pass

#if you only want to send data to arduino (i.e. a signal to move a servo)
def send( theinput ):
    ser.write( theinput )
    while True:
        try:
            time.sleep(0.01)
            break
        except:
            pass
    time.sleep(0.1)

#if you would like to tell the arduino that you would like to receive data from the arduino
def send_and_receive( theinput ):
    ser.write( theinput )
    while True:
        try:
            time.sleep(0.01)
            state = ser.readline()
            print state
            return state
        except:
            pass
    time.sleep(0.1)

def readlineCR(port):
    rv = ""
    while True:
        ch = port.read()
        if ch=='\r' or ch=='':
            return rv
        else:
            rv += ch
#if you would like to tell the arduino that you would like to receive data from the arduino
def receive(  ):
    while True:
        try:
            print "try to read..."
            time.sleep(0.01)
            state = readlineCR(ser)
            if len(state)>1:
                print "State: " + state
                if "playsound" in state:
                    os.system("clear > tty1")
                    plstr="cat t|omxplayer -o both --vol \"-200\" "
                    name=state.split(" ",1)[1]
                    name= "/home/pi/"+name
                    name=name.replace("\n", "")
                    name=name.replace("\r", "")
                    ender=" >> /dev/null &"
                    command= plstr 
                    command=command+ name 
                    command=command+ ender
                    print command
                    os.system(command)
                elif "pl1play" in state:
                    name=state.split(" ",1)[1]
                    name=name.replace("\n", "")
                    name=name.replace("\r", "")
                    name= "/home/pi/"+name
                    global player1
                    player1= OMXPlayer(name)
                    player1.play()
                    print command
                elif "pl2play" in state:
                    name=state.split(" ",1)[1]
                    name=name.replace("\n", "")
                    name=name.replace("\r", "")
                    name= "/home/pi/"+name
                    global player2
                    player2 = OMXPlayer(name)
                    player2.play()
                    print command
                elif "pl3play" in state:
                    name=state.split(" ",1)[1]
                    name=name.replace("\n", "")
                    name=name.replace("\r", "")
                    name= "/home/pi/"+name
                    global player3
                    player3 = OMXPlayer(name)
                    player3.play()
                    print command
                elif "stoppl1" in state:
                    vol =0
                    while(vol<6000):
                        vol=vol+150
                        player1.set_volume(0,-vol)
                        time.sleep(0.1)
                    player1.pause()
                    player1.quit()
                    print command
                elif "stoppl2" in state:
                    vol =0
                    while(vol<6000):
                        vol=vol+150
                        player2.set_volume(0,-vol)
                        time.sleep(0.1)
                    player2.pause()
                    player2.quit()
                    print command
                elif "stoppl3" in state:
                    vol =0
                    while(vol<6000):
                        vol=vol+150
                        player3.set_volume(0,-vol)
                        time.sleep(0.1)
                    player3.pause()
                    player3.quit()
                    print command
                elif "stopsound" in state:
                    os.system("kill -9 `ps au | grep omxplayer | awk '{print $2}'`")
                    print command
                return state
            else:
                print "failed no data..."
                return "nodata"
        except Exception, e:
            time.sleep(0.1)  
            print ""
            print "Unexpected error:", str(e)
    
#f = open('dataFile.txt','a')
ser.flushInput()
while 1 :
    receive()
  • Вопрос задан
  • 560 просмотров
Решения вопроса 2
zelsky
@zelsky
весь скрипт крутится в while(true) одного def

Вот где проблема.
Ответ написан
valerium
@valerium
Изобретая велосипед
Python — объектно-ориентированный язык. Почему бы не следовать этой парадигме?

Создайте объект OMXPlayerWrapper, создайте ему атрибут player, в котором будет находиться плеер, и делайте с ним всё, что хотите, из любого метода этого класса. И никакие глобальные объекты (которые сами по себе зло) не нужны.

И да, показать код (причёсанный) не помешало бы.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы