OSError: [Errno 24] Too many open files: /home/pi/txt/txt.txt

0

Witam

Jest to moja pierwsza styczność z programowaniem w Python'nie.
Zbudowałem wyświetlacz segmentowy w firmie, każda cyfra 8". Wszystko sprzężone z RP.
mam taki kod, który odczytuje plik tekstowy co 5s i wyświetla go na wyświetlaczu:

def main():
    while True:
        # create seven segment device
        serial = spi(port=0, device=0, gpio=noop())
        device = max7219(serial, cascaded=1)
        seg = sevensegment(device)
        f= open('/home/pi/txt/txt.txt', 'r')
        file_contents = f.read()
        seg.text = (file_contents)
        f.close()
        time.sleep(5)

Po pewnym czasie pojawia się błąd: > OSError: [Errno 24] Too many open files: /home/pi/txt/txt.txt <

Plik otwieram i zamykam. Co mam nie tak z tym kodem?

0

Nie wywala ci jakiegoś wyjątku i nie zamyka pliku? Możesz spróbować tak: https://www.pythonforbeginners.com/files/with-statement-in-python

1

Czy f.closed przestawia się na True po zamknięciu? Jesteś w stanie potwierdzić lsof, że faktycznie wiszą otwarte deskryptory? Ile czasu zwykle to działa zanim się wywali?

1

a ten serial / spi /device to też nie jest plikiem?
Nie wiem, ale w filozofii uniksowej tak by było

To jakieś raspberry? Pewnie koledzy zapytają jaki system?

0

Wysypuje się coś po około 1-2h. Nie wiem dokładnie bo nie siedze przy nim. Jak ktoś zgłosi to zerkne i uruchomię skrypt jeszcze raz.

Dokładnie wyświetla tak:

Traceback (most recent call last):
  File "/home/pi/max7219/examples/redan.py", line 96, in <module>
  File "/home/pi/max7219/examples/redan.py", line 86, in main
OSError: [Errno 24] Too many open files: '/home/pi/txt/txt.txt'

Linia 96: main()
Linia 86: f= open('/home/pi/txt/txt.txt', 'r')

Tak, to jest Raspberry PI 3B

Puściłem teraz skrypt ze zmienioną komendą f = open na file = open i tak samo z f.close na file.close. Zobaczymy co będzie.

Czy spi/device tez jest plikiem dla linuxa... nie wiem :(

Ulimit pokazuje:
open files (-n) 1024

Skrypt wykonuje się co 5s. Więc skrypt na minutę wykonuje się 12 razy. 1024/12=85min. Może i po takim czasie się wysypuje cały skrypt. Ale dziwne, ja nic nie widzę w "lsof":
https://4programmers.net/Pastebin/16007

3

Nie przedłużając...

def main():
    serial = spi(port=0, device=0, gpio=noop())
    device = max7219(serial, cascaded=1)
    seg = sevensegment(device)
    while True:
        f= open('/home/pi/txt/txt.txt', 'r')
        file_contents = f.read()
        seg.text = (file_contents)
        f.close()
        time.sleep(5)
0

ok. No to leci test... jeżeli zadziała to rozumiem gdzie był błąd. Dam znać do 15.00 :)

ps. następnym razem będę wiedział gdzie wkleić dłuuuugi kod. Dzięki za wskazówkę @UglyMan

0

Potwierdzam, że podany kod przez @tsz działa poprawnie.
Mylny okazał się komunikat błędu. Ale fachowiec dojrzał gdzie jest faktycznie przyczyna.

Dzięki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1