Как настроить псевдоним для импорта в Python? - PullRequest
0 голосов
/ 26 сентября 2018

Я хочу, чтобы мой проект работал в двух разных ситуациях.Он должен работать как отдельная библиотека, но также как подпакет более крупного проекта.Основным вариантом использования является использование автономной библиотеки, где ее внутренний импорт должен иметь вид

from my_library import sub_package

. При использовании кода в качестве подпакета более крупного проекта этот импорт не работает так, как есть.нет глобального имени my_library.Вместо этого мне пришлось бы использовать относительный или абсолютный импорт, например

from large_project.my_library import sub_package

Давайте предположим, что я написал свою библиотеку, как показано в первом примере.Как переписать поведение при импорте при работе в рамках более крупного проекта для автоматической корректировки путей импорта?

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Благодаря предложению @ MatrixTai добавить родительский каталог пакета в путь к модулю, я предложил это динамическое решение.Вверху my_library/__init__.py:

# Make package global even if used as a sub package to enable short imports.
import os
import sys
sys.path.append(os.path.dirname(os.path.dirname(__file__)))

Нам нужно перейти вверх по двум каталогам, чтобы сделать это от my_library/__init__.py до my_library и оттуда к его родительскому направлению, где при импорте будет найдена библиотека.

0 голосов
/ 26 сентября 2018

У вас нет большого выбора.

Если вы хотите сослаться на my_library.py в любом месте, есть 2 метода (как я знаю), которые могут выполнять аналогичную работу.


1: добавить системный путь.Как и те модули, которые вы установили pip.Модуль pip установлен в /Python/Scripts.Вы можете добавить новый путь или просто вставить my_library.py в один из путей.Для добавления, это в Computer(right-click)-> Properties -> Environment Variable -> Choose Path and Click Edit

(хотя вы, возможно, не захотите использовать это.)


2: изменение __init__.py, но все равно нужно добавить хотя бы одну строкув my_library.py.

Например,

/Directory
   /large_project
      -__init__.py #call this sub_init
      -my_library.py
   -__init__.py #call this main_init, this fake
   -main.py

В main_init,

import sys
sys.path.append('\\Directory\\large_project')

Поскольку main_init не выполняется при выполнении main.py (это фальшивка), поэтому в main.py

import __init__
from my_library import sub_package

Но вы также можете использовать этот main_init как стартер библиотеки, например, объявив __all__ и т. д.

...