Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

[from . import fichier.py] fonctionne avec python 3.5 mais pas python 3.4

0 votes

Mon code fonctionne avec python3.5 mais pas avec python3.4.

Il ya a une erreur d'import avec python3.4 :

Traceback (most recent call last):
  File "/home/*/dev/python/rasp/mon_app/mon_app.py", line 1, in <module>
    from code.main import main
  File "/home/*/dev/python/rasp/mon_app/code/main.py", line 3, in <module>
    from .scenes import scene_1
  File "/home/*/dev/python/rasp/mon_app/code/scenes/scene_1.py", line 4, in <module>
    from . import scene_2
  File "/home/*/dev/python/rasp/mon_app/code/scenes/scene_2.py", line 4, in <module>
    from . import scene_1
ImportError: cannot import name 'scene_1'

Process finished with exit code 1

Je comprends pas pourquoi ça fonctionne bien avec python3.5 et pas python3.4.

Je veux utiliser python3.4 parce que c'est la version fournie avec raspbian.

Quel est le problème ?

arborescence de l'application :

mon_app.py
code/
    main.py
    __init__.py
    scenes/
          scene_base.py
          scene_1.py
          scene_2.py

pour lancer l'application je tape la commande : python3 mon_app.py

fichier mon_app.py

from code.main import main

if __name__ == '__main__':
    main()

fichier code/main.py

import pygame

from .scenes import scene_1


def run_app(starting_scene):
    pygame.init()
    screen = pygame.display.set_mode((1024, 768))
    clock = pygame.time.Clock()

    active_scene = starting_scene

    while active_scene != None:
        pressed_keys = pygame.key.get_pressed()


        filtered_events = []
        for event in pygame.event.get():
            quit_attempt = False
            if event.type == pygame.QUIT:
                quit_attempt = True
            elif event.type == pygame.KEYDOWN:
                alt_pressed = pressed_keys[pygame.K_LALT] or \
                              pressed_keys[pygame.K_RALT]
                if event.key == pygame.K_ESCAPE:
                    quit_attempt = True
                elif event.key == pygame.K_F4 and alt_pressed:
                    quit_attempt = True

            if quit_attempt:
                active_scene.terminate()
            else:
                filtered_events.append(event)

        active_scene.process_input(filtered_events, pressed_keys)
        active_scene.update()
        active_scene.render(screen)

        active_scene = active_scene.next

        pygame.display.flip()
        clock.tick(60)


def main():
    run_app(scene_1.Scene1())

le fichier code/init.py est vide

fichier code/scenes/scene_base.py

class SceneBase:
    def __init__(self):
        self.next = self

    def process_input(self, events, pressed_keys):
        pass

    def update(self):
        pass

    def render(self, screen):
        pass

    def switch_to_scene(self, next_scene):
        self.next = next_scene

    def terminate(self):
        self.switch_to_scene(None)

fichier code/scenes/scene_1.py

import pygame

from . import scene_base
from . import scene_2


class Scene1(scene_base.SceneBase):
    def __init__(self):
        super().__init__()

    def process_input(self, events, pressed_keys):
        super().process_input(events, pressed_keys)

        for event in events:
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    self.switch_to_scene(scene_2.Scene2())

    def render(self, screen):
        screen.fill((0,0,255))

fichier code/scenes/scene_2.py

import pygame

from . import scene_base
from . import scene_1


class Scene2(scene_base.SceneBase):
    def __init__(self):
        super().__init__()

    def process_input(self, events, pressed_keys):
        super().process_input(events, pressed_keys)

        for event in events:
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    self.switch_to_scene(scene_1.Scene1())

    def render(self, screen):
        screen.fill((255,0,255))

En appyant sur la flèche gauche, cela permet de changer de scene.

demandé 9-Mar par flo77 (104 points)

1 Réponse

+2 votes

Ajoute un fichier init.py dans ton package scenes.

répondu 10-Mar par vmonte (188 points)

J'ai déjà essayé de rajouter un fichier init.py, de faire les imports dans le fichier init,...

Le code fonctionne bien sur Python3.5 (pas sur Python3.4)

En fait, apparement, ce que je veux faire s'appelle un "import circulaire" : http://sametmax.com/quelques-erreurs-tordues-et-leurs-solutions-en-python/

Du coup, en mettant les imports dans une fonction, ça fonctionne...

...