EOFError lors du boot sur un script .py

EOFError lors du boot sur un script .py - Python - Programmation

Marsh Posté le 22-06-2020 à 13:13:07    

Bonjour à tous,  
J'ai pu appréhender le langage python à travers un projet qui consiste à allumer des LEDs dans un meuble de rangement pour indiquer la position de différents articles. Le programme marche sans aucun soucis lorsque l'ordinateur est en fonctionnement, c'est à dire que lorsque la session est lancée, et que j'appelle le script via une commande linux "python main.py" tout fonctionne parfaitement. Mon problème réside dans le fait que j'aimerai lancer automatiquement ce programme au boot de l'ordinateur. Dans ce cas, une erreur s'affiche "EOFError : EOF when reading a line" à la suite d'un input() (ligne 107). Je n'arrive pas bien à saisir ce qui change entre lancer le programme automatiquement au démarrage de l'ordinateur et le lancer manuellement. Je ne suis pas convaincu que l'intégralité du code vous intéresse mais je le poste tout de même au cas où.  
Merci d'avance pour votre aide  
 

Code :
  1. # coding=utf-8
  2. import time
  3. time.sleep(15)
  4. #Boucle infini permettant de faire tourner le programme en continu
  5. while True :
  6.     #IMPORT DES BIBLIOTHEQUES
  7.     #L'ajout de ces deux bibliothèques permet de gérer l'acquisition des données
  8.     #et de sortir du programme en fin d'acquisition
  9.     import sys
  10.     import select
  11.     # La bibliothèque time permet de réaliser des delay avec time.sleep
  12.     #import time
  13.     # La bibliothèque Adafruit_CharLCD permet de piloter l'écran LCD
  14.     import Adafruit_CharLCD as LCD
  15.     #La bibliothèque RPi.GPIO permet d'utiliser les pins du GPIO pour envoyer un signal haut ou bas
  16.     import RPi.GPIO as GPIO
  17.     #Bibliothèque permettant de lire dans un fichier Excel
  18.     import xlrd
  19.     #OUVERTURE DE LA BASE DE DONNEE EXCEL
  20.     #Ouverture du document Excel
  21.     document = xlrd.open_workbook("/home/pi/Base.xlsx" )
  22.     #On se place sur la feuille 1
  23.     data = document.sheet_by_index(0)
  24.     #On compte le nombre de lignes que comportent notre base de données,
  25.     #ce qui équivaut à évaluer le nombre de références
  26.     nbr_lignes = data.nrows
  27.     #CONFIGURATION DU GPIO ET DES LEDS
  28.     #On définit ici la façon dont les pins du GPIO seront appelées
  29.     #GPIO.BOARD correspond au nommage des pins de 01 à 40
  30.     #GPIO.BCM correspond au nommage des pins selon leur nom (numéro après GPIO)
  31.     GPIO.setmode(GPIO.BCM)
  32.     #Toutes les erreurs qui n'empêchent pas la compilation et l'éxécution du programme seront négligées
  33.     GPIO.setwarnings(False)
  34.     #Création de variables LEDx stockant les pins reliées aux LEDs
  35.     LED1 = 21
  36.     LED2 = 20
  37.     LED3 = 16
  38.     LED4 = 26
  39.     #On configure ces pins en sortie (capable d'envoyer 0 ou 5V)
  40.     GPIO.setup(LED1, GPIO.OUT)
  41.     GPIO.setup(LED2, GPIO.OUT)
  42.     GPIO.setup(LED3, GPIO.OUT)
  43.     GPIO.setup(LED4, GPIO.OUT)
  44.     #RAZ des leds
  45.     GPIO.output(LED1,GPIO.LOW)
  46.     GPIO.output(LED2,GPIO.LOW)
  47.     GPIO.output(LED3,GPIO.LOW)
  48.     GPIO.output(LED4,GPIO.LOW)
  49.     #CONFIGURATION DU LCD
  50.     # On définit la correspondance entre les pins du GPIO et de l'écran LCD
  51.     lcd_rs = 25   #RS = Register Select
  52.     lcd_en = 24   #EN = Enable
  53.     lcd_d4 = 23   #d4,d5,d6,d7 sont les 4 pins de données
  54.     lcd_d5 = 17   #nous commencons à d4 et non pas à d0 car les 4 premières pins
  55.     lcd_d6 = 18   #(d0 -> d3) ne doivent pas être utilisées pour les opérations
  56.     lcd_d7 = 22   #4 bits
  57.     lcd_backlight = 4   #Borne + (anode) du rétroéclairage LCD
  58.     # On renseigne la taille de l'écran (ici 20x4)
  59.     lcd_columns = 20
  60.     lcd_rows = 4
  61.     # On renseigne dans la fonction CharLCD la correspondance LCD->GPIO définie précédemment
  62.     lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows, lcd_backlight)
  63.     #RAZ de l'écran LCD
  64.     lcd.clear()
  65.     #PROGRAMME OPERATEUR
  66.     # Affichage d'une chaine de caractères sur l'écran LCD
  67.     lcd.message('Scannez code datamatrix : \n')
  68.     # Affichage sur le terminal de l'instruction
  69.     print('Scannez le code : ')
  70.     #La fonction input() permet de récupérer une entrée clavier
  71.     code_1 = input()
  72.     print(code_1)
  73.     #On stocke les autres données du datamatrix dans des variables
  74.     #La variable a contient l'entrée clavier
  75.     #La dernière donnée de la fonction select.select() correspond au timeout
  76.     a, b, c = select.select( [sys.stdin], [], [], 0.5)
  77.     #Condition permettant de sortir du programme si aucune nouvelle entrée
  78.     #clavier n'est détectée
  79.     #Les conditions se succèdent pour couvrir les 5 lignes du datamatrix
  80.     if(a) :
  81.         code_2 = sys.stdin.readline().strip()
  82.         print(code_2)
  83.         print("1" )
  84.         d, e, f = select.select( [sys.stdin], [], [], 0.5)
  85.         if(d) :
  86.             code_3 = sys.stdin.readline().strip()
  87.             print(code_3)
  88.             print("1" )
  89.             g, h, i = select.select( [sys.stdin], [], [], 0.5)
  90.             if(g) :
  91.                 code_4 = sys.stdin.readline().strip()
  92.                 print(code_4)
  93.                 print("1" )
  94.                 j, k, l = select.select( [sys.stdin], [], [], 0.5)
  95.                 if(j) :
  96.                     code_5 = sys.stdin.readline().strip()
  97.                     print(code_5)
  98.                     print("1" )
  99.                     m, n, o = select.select( [sys.stdin], [], [], 1.0)
  100.                     if(m) :
  101.                         code_6 = sys.stdin.readline().strip()
  102.                         print(code_6)
  103.                         print("1" )
  104.                         p, q, r = select.select( [sys.stdin], [], [], 1.0)
  105.                         if(p) :
  106.                             code_7 = sys.stdin.readline().strip()
  107.                             print(code_7)
  108.                             print("1" )
  109.                             s, t, u = select.select( [sys.stdin], [], [], 1.0)
  110.                             if(s) :
  111.                                 code_8 = sys.stdin.readline().strip()
  112.                                 print(code_8)
  113.                                 print("1" )
  114.                                 v, w, x = select.select( [sys.stdin], [], [], 1.0)
  115.                                 if(v) :
  116.                                     code_9 = sys.stdin.readline().strip()
  117.                                     print(code_9)
  118.                                     print("1" )
  119.     time.sleep(5)
  120.     #On initialise nos 2 variables utilisées dans les boucles suivantes
  121.     Lexan = 0
  122.     i = 0
  123.     j = 0
  124.     #On parcourt la base de donnée à la recherche d'une référence de PES ou de Lexan
  125.     while i < nbr_lignes :
  126.         #On définit la colonne du fichier Excel où se situent les données
  127.         lecture_PES = data.cell_value(rowx=i, colx=1)
  128.         lecture_Lexan = data.cell_value(rowx=i, colx=2)
  129.         #Condition si correspondance entre le code scanné par l'opérateur
  130.         #et la base de donnée
  131.         if lecture_PES == code_1 or lecture_Lexan == code_1:
  132.             #On va chercher la référence du Lexan dans la base de donnée
  133.             #et on l'affiche sur l'écran LCD
  134.             Lexan = data.cell_value(rowx=i, colx=2)
  135.             lcd.clear()
  136.             lcd.message(Lexan)
  137.             #On va chercher la LED correspondant à l'emplacement
  138.             #où est stocké le Lexan et on la configure en sortie
  139.             LED = int(data.cell_value(rowx=i, colx=3))
  140.             print(LED)
  141.             GPIO.setup(LED, GPIO.OUT)
  142.             #Boucle permettant de faire clignoter la LED indiquant à l'opérateur
  143.             #l'emplacement du Lexan à utiliser
  144.             while j<10 :
  145.                 GPIO.output(LED,GPIO.HIGH)
  146.                 time.sleep(0.5)
  147.                 GPIO.output(LED,GPIO.LOW)
  148.                 time.sleep(0.5)
  149.                 j = j+1
  150.             print(Lexan)
  151.             print(code_1)
  152.             #Si la boucle est parcourue cela signifie qu'une correspondance a
  153.             #été trouvée entre le scan et la base de données, on peut donc sortir
  154.             #de la boucle
  155.             i=nbr_lignes
  156.         #On parcourt les lignes de la base de donnée
  157.         i = i+1
  158.     #Condition si aucune correspondance entre scan et base de données n'a été trouvée
  159.     if Lexan == 0 :
  160.         print("La référence n'est pas disponible" )
  161.         lcd.clear()
  162.         lcd.message("Pas disponible" )
  163.         time.sleep(5)

Reply

Marsh Posté le 22-06-2020 à 13:13:07   

Reply

Marsh Posté le 22-06-2020 à 19:43:08    

Mon problème a été résolu en utilisant la méthode bashrc disponible dans le lien suivant pour lancer le programme au boot de la machine :  https://www.dexterindustries.com/ho [...] t-startup/

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed