Циклический импорт в Python3 - PullRequest
0 голосов
/ 19 июня 2019

У меня следующая структура каталогов:

my-game/
  __init__.py
  logic/
    __init__.py
    game.py
    player.py

game.py и player.py имеют зависимость импорта друг от друга (циклический импорт).

game.py имеет следующее определение.

from logic.player import RandomPlayer, InteractivePlayer

T = 8

class Game:
  def __init__(self, p1, p2)
    ...

# some other things

if __name__ == '__main__':
  p1 = RandomPlayer()
  p2 = InteractivePlayer()
  g = Game(p1, p2)
  ...

player.py выглядит следующим образом:

from logic.game import T

class Player:
  def __init__(self):
    ...

class RandomPlayer(Player):
  def __init__(self):
    ...

class InteractivePlayer(Player):
  def __init__(self):
    ...

Я пытаюсь запустить игру из каталога logic/, но получаю следующую ошибку.

$ python3 game.py
Traceback (most recent call last):
  File "game.py", line 2, in <module>
    from logic.player import RandomPlayer, InteractivePlayer
ModuleNotFoundError: No module named 'logic'

Затем я попытался запустить game.py из каталога выше (my-game/).

$ python3 logic/game.py
Traceback (most recent call last):
  File "logic/game.py", line 2, in <module>
    from logic.player import RandomPlayer, InteractivePlayer
ModuleNotFoundError: No module named 'logic'

Что я делаю не так? Как я могу заставить этот циклический импорт работать?

Я также пытался использовать этот импорт в player.py

from .game import T

и использование

from .player import RandomPlayer, InteractivePlayer

в game.py.

В этом случае я получаю другую ошибку. Например, при запуске с my-game/,

$ python3 logic/game.py
Traceback (most recent call last):
  File "logic/game.py", line 2, in <module>
    from .player import RandomPlayer, InteractivePlayer
ModuleNotFoundError: No module named '__main__.player'; '__main__' is not a package

Я получаю похожую ошибку при запуске из каталога logic/.

Я посмотрел этот пост, но не понял, где я ошибался.

1 Ответ

0 голосов
/ 19 июня 2019

Вы сделали импорт Cirlair в своем коде, попробуйте удалить его из своего импорта Перейдите по этой ссылке, чтобы найти другую информацию о циклическом импорте: Удалить python циркулярный импорт

...