Я часто пишу относительный импорт Python 3, который выглядит следующим образом:
# in main.py
try:
# An import that works if the current module is installed with pip
from .otherfile import some_func
print("The .otherfile import worked")
except ImportError:
# An import that works of I run ./main.py from my source code folder
print("The .otherfile import failed")
from otherfile import some_func
print("The otherfile import worked")
Этот пример кода работает как задумано, я могу сделать оба из следующих действий:
[username@localhost mymodule]# python3.6 mymodule/main.py
The .otherfile import failed
The otherfile import worked
Hello World?
.
[username@localhost mymodule]# python3.6
Python 3.6.5 (default, Apr 10 2018, 17:08:37)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import mymodule
The .otherfile import worked
>>> mymodule.run_me()
Hello World?
>>>
И моя импортированная функция запускается в обоих случаях, но я не могу не думать, что каким-то образом неправильно выполняю свой импорт.Должен быть способ сделать простой относительный импорт, который работает правильно как для кода, установленного в pip, так и для кода, который я запускаю напрямую.
И если я просто попробую простой файл из импорта другого файла some_func, то он отлично подойдет для python3.6mymodule / main.py, но когда я пробую его из установленного модуля pip, я получаю:
[username@localhost mymodule]# python3.6
Python 3.6.5 (default, Apr 10 2018, 17:08:37)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import mymodule
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/testuser/src/mymodule/mymodule/__init__.py", line 1, in <module>
from .main import run_me
File "/home/testuser/src/mymodule/mymodule/main.py", line 3, in <module>
from otherfile import some_func
ModuleNotFoundError: No module named 'otherfile'
Я помещаю копию моего тестового примера на github;https://github.com/James00001/mymodule
Чтобы подвести итог вопроса:
Как правильно сделать относительный импорт Python, который работает как для непосредственного выполнения файла, так и для импорта файла изpip установленный модуль?