Python 3: как лучше всего сделать относительный импорт, который работает как с кодом, установленным в pip, так и непосредственно с файлами py? - PullRequest
0 голосов
/ 18 октября 2018

Я часто пишу относительный импорт 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 установленный модуль?

...