Python3 multiprocessing.Process завершается ошибкой после компиляции с помощью pyinstaller - PullRequest
0 голосов
/ 06 октября 2018

У меня есть простой скрипт на python, который подключается к устройству Arduino и создает некоторые графики из последовательного соединения.Графики должны обновляться в реальном времени, поэтому я запускаю некоторые процессы, чтобы мой main не блокировался.

Исходный код работает как положено (без ошибок, без сбоев и т. Д.), Но когда я компилирую его с помощью pyinstaller наТестирование виртуальной машины, которую я создал, похоже, ведет себя неожиданно.Процессы начинают свое выполнение не с целевой функции, которую я предоставляю, а как моя основная.

Как я могу остановить это и получить нормальное поведение?

Это мой упрощенный код:

from multiprocessing import Process
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib import style

def animateSpeed(i):
    fig1 = plt.figure(1)
    ax1 = fig1.add_subplot(1,1,1)
    ax1.set_title('Speed Graph')
    ax1.set_ylabel('Speed')
    ax1.set_xlabel('Hits')

    graph_data1 = open('./plotfiles/speedplot.txt').read()
    lines1 = graph_data1.split('\n')
    x1s = []
    y1s = []
    for line in lines1:
        if len(line) > 1:
            x,y = line.split(',')
            y = float(y)
            x = int(x)
            x1s.append(x)
            y1s.append(y)
    ax1.clear()
    ax1.set_title('Speed Graph')
    ax1.set_ylabel('Speed')
    ax1.set_xlabel('Hits')
    ax1.plot(x1s, y1s)


def runGraph1(fig1 = None):
    fig1 = plt.figure(1)
    ax1 = fig1.add_subplot(1,1,1)
    ax1.set_title('Speed Graph')
    ax1.set_ylabel('Speed')
    ax1.set_xlabel('Hits')

    speedplot = animation.FuncAnimation(fig1, animateSpeed, interval=500)
    plt.show()

def parse(chunk,printer_name, picture, cam_num):
    speed = (chunk[offset2].split())[1]
    speedfile = open("./plotfiles/speedplot.txt","a+")
    speedfile.write(str(total_hits)+","+str(speed)+"\n")

if __name__ == "__main__":

    p1 = Process(target=runGraph1)
    p1.start()

    com = select_com()
    print("selected com is:"+com+"\n")
    try:
        ser = serial.Serial(com, 115200, timeout=1)
    except Exception as e:
        raise e

    lineBuf = []
    waiting_for_data= True
    stop = False
    while (stop != True):
        line = ser.readline().decode('utf-8').strip('\r\n')
        if len(line) == 0 or re.match(' \r\n', line):
            continue


        # if waiting_for_data:
        lineBuf.append(line)
        # if "Finished This Round" in line:
        #   print("Finished This Round, about to put: '", lineBuf, "'in myQueue")
        #   # myQueue.put(lineBuf)
        #   parse(lineBuf)
        #   break

        if (re.match('[-]+', line)) and (lineBuf != []):
            del lineBuf[-1] #   remove "---------------'s"
            # print("grammes, about to put: '", lineBuf, "'in myQueue")
            waiting_for_data = not waiting_for_data
            # myQueue.put(lineBuf)
            parse(lineBuf,printer_name, picture,cam_num)
            # if waiting_for_data:

            lineBuf = []


    ser.close()

Я проверил известную проблему с многопроцессорностью и pyinstaller, но яне думаю, что это относится к моему делу.

Как я могу обойти / обойти это?

...