Как заставить импортировать модуль в Python 3? - PullRequest
0 голосов
/ 28 октября 2019

У меня есть два пакета со структурой, подобной этой:

Package1/calc1.py
Package1/utils.py

Package2/calc2.py
Package2/utils.py

calc1.py выглядит так:

#calc1.py
import utils
...

, а calc2.py выглядит одинаково:

#calc2.py
import utils
...

Также у меня есть основной модуль с файлом main.py. Это начинается так:

import package1.calc1
import package2.calc2

После запуска main.py я получил ошибку:

ImportError: cannot import name 'utils'

Это происходит потому, что когда calc1.py import utils (из Package1), утилиты добавленыкешировать. Поэтому, когда пришло время импортировать утилиты из Package2 с помощью calc2.py, утилиты уже в кеше, и я получил ошибку. Эти утилиты файлы разные, и я не могу их переименовать, они должны иметь одинаковые имена, это важно.

Вопрос такой: есть ли какие-либо возможные способы заставить модули импорта переписать кеш, или, возможно, очистить кеш модуля?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

Имеется функция reload() в imp / importlib модуле

Для Python2.x

reload(module)

Для версий выше 2.x и <= Python3.3 </p>

import imp
imp.reload(module)

Для> = Python3,4

import importlib
importlib.reload(module)
0 голосов
/ 28 октября 2019

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

Структура проекта :

/
├ main.py
├ pkg1
│  ├ calc1.py
│  └ utils.py
└ pkg2
   ├ calc2.py
   └ utils.py

main.py :

import pkg1.calc1
import pkg2.calc2

pkg1.calc1.times5()
pkg2.calc2.times10()

calc1.py :

# absolute path import
from pkg1 import utils

def times5():
  print(utils.name)
  print(f'{utils.val} x 5 = {utils.val * 5}')

pkg1.utils.py :

name = 'using pkg1.utils.py'
val = 1

calc2.py:

# relative path import
from . import utils

def times10():
  print(utils.name)
  print(f'{utils.val} x 10 = {utils.val * 10}')

pkg2.utils.py :

name = 'using pkg2.utils.py'
val = 2

Вывод из main.py :

using pkg1.utils.py
1 x 5 = 5
using pkg2.utils.py
2 x 10 = 20

Вы также можете узнать больше о абсолютный или относительный импорт здесь .

...