У меня проблема с импортом. Я пытаюсь импортировать 2 функции с одинаковыми именами из модулей с одинаковыми именами. Обратите внимание, что я делаю это в Pycharm.
У меня есть следующая структура каталогов:
test_import
|--foo.py
|--main.py
|--test
|--foo.py
Код
foo.py
в папке test_import выглядит следующим образом:
def print_arg(x):
print('print 1: {}'.format(x))
foo.py
в папке test выглядит следующим образом:
def print_arg(x):
print('print 2: {}'.format(x))
Вот мой код в main.py
, в котором я нахожусь делать импорт print_arg
:
import sys
from foo import print_arg as print_arg
print_arg(1)
sys.path.insert(1, './test')
from foo import print_arg as print_arg_2
print_arg(1)
print_arg_2(1)
Я ожидаю, что это напечатает
print 1: 1
print 1: 1
print 2: 1
Но он печатает
print 1: 1
print 1: 1
print 1: 1
Почему-то второй импорт не работает и print_arg_2
становится ссылкой на print_arg
. Это иллюстрируется выполнением импорта наоборот:
sys.path.insert(1, './test')
from foo import print_arg as print_arg_2
print_arg_2(1)
sys.path.pop(1)
from foo import print_arg
print_arg(1)
print_arg(1)
print_arg_2(1)
, который печатает:
print 2: 1
print 2: 1
print 2: 1
Изменение имени функции в test / foo.py на print_arg_2
не работает , это приводит к ошибке. Кажется, что ссылка на foo.py
в папке проекта была создана, и она пытается импортировать ее оттуда вместо поиска в других каталогах на sys.path
Traceback (most recent call last):
File "C:\Users\jeroe\AppData\Local\Programs\Python\Python37\lib\site-packages\IPython\core\interactiveshell.py", line 3326, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-2-10fe80aec78f>", line 5, in <module>
from foo import print_arg_2 as print_arg_2
ImportError: cannot import name 'print_arg_2' from 'foo' (C:\Users\jeroe\PycharmProjects\test_import\foo.py)
Изменение имени файла foo.py
в папка test, например, foo2.py
работает. Однако я предпочитаю не менять имя файла.
Поэтому у меня есть 2 вопроса:
Может кто-нибудь объяснить мне, что здесь происходит?
Как лучше импортировать эти 2 функции без изменения имени файла (модуля)?