Ошибка "Нет такого файла" при запуске автоскрипта

Я работаю над проектом, который предполагается открыть во время запуска Raspberry Pi. Я могу открыть несколько других сценариев при запуске, однако сценарий, который я пытаюсь открыть во время запуска, не открывается.

Примечание: этот код работает, когда я запускаю его через IDLE, но он не будет работать, когда я тестирую его через терминал LX. Когда я тестирую скрипт под скриптом автозапуска, он выдает ошибку.
Еще одно примечание: все файлы изображений находятся в той же папке, что и скрипт.

Вот мой код:

from Tkinter import *
from PIL import Image, ImageTk
from random import randint
import RPi.GPIO as GPIO

root = Tk()
root.overrideredirect(True)
root.geometry("1920x1080+0+0")

image=Image.open('bikebackground.png')
background_image = ImageTk.PhotoImage(image)
background_label = Label(root, image=background_image)
background_label.place(x=0, y=0, relwidth=1, relheight=1)

speed = 4

class Biker(Label):
def __init__(self, master, filename):
    im = Image.open(filename)
    seq =  []
    try:
        while 1:
            seq.append(im.copy())
            im.seek(len(seq)) # skip to next frame
    except EOFError:
        pass # we're done

    try:
        self.delay = im.info['duration']/speed
    except KeyError:
        self.delay = 100

    first = seq[0].convert('RGBA')
    self.frames = [ImageTk.PhotoImage(first)]

    Label.__init__(self, master, image=self.frames[0])

    temp = seq[0]
    for image in seq[1:]:
        temp.paste(image)
        frame = temp.convert('RGBA')
        self.frames.append(ImageTk.PhotoImage(frame))

    self.idx = 0

    self.cancel = self.after(self.delay, self.play)

def play(self):
    self.config(image=self.frames[self.idx])
    self.idx += 1
    if self.idx == len(self.frames):
        self.idx = 0
    self.cancel = self.after(self.delay, self.play)

anim = Biker(root, 'racer2.gif')
anim.place(relx=0, rely=0, relwidth=1, relheight=1)

w = Label(root, text= 'You are generating\n%d.%d Watts\nof power' %(randint(10,15),
  randint(0,99)), font=("Helvetica", 50))
w.place(relx=.6, rely=.5, relwidth=.4, relheight=.25)

wh = Label(root, text= 'You have generated\n%d.%d Kilojoules\nof energy' %(randint(0,2),     
  randint(0,99)), font=("Helvetica", 50))
wh.place(relx=.6, rely=.75, relwidth=.4, relheight=.25)
root.mainloop()

В LX Terminal при тестировании кода возникает ошибка:

pi@raspberrypi ~/bin $ /home/pi/bin/script_auto_run
Doing autorun script...
pi@raspberrypi ~/bin $ Traceback (most recent call last):
 File "/home/pi/New/Display.py", line 10, in <module>
   image=Image.open('bikebackground.png')
  File "/usr/local/lib/python2.7/dist-packages/PIL/Image.py", line 2093, in open
   fp = builtins.open(fp, "rb")
IOError: [Errno 2] No such file or directory: 'bikebackground.png'

2 ответа

Кажется, что скрипт не запускается из той же папки, поэтому он не находит картинки в рабочем каталоге. Вы должны добавить абсолютный путь к папке к пути изображения:

import os.path

# Get the folder on the current file (/home/pi/New for your case)
SCRIPT_DIR = os.path.basename(__file__)

# and then use os.path.join to concatenate paths
image = Image.open(os.path.join(SCRIPT_DIR, 'bikebackground.png'))

.. или явно переместить в папку скрипта перед запуском скрипта.

Вместо того, чтобы идти по абсолютному пути, я просто запустил скрипт в среде LXDE, которая позволяет мне с легкостью загружаться при запуске. Это было сделано, открыв LX Terminal и выполнив: sudo nano /etc/xdg/lxsession/LXDE/autostart

Затем введите следующую команду в файл автозапуска: @sudo python /home/pi/New/Display.py

Затем перезагрузил RPi и все заработало.

Другие вопросы по тегам