Структура импорта библиотеки в python - PullRequest
0 голосов
/ 06 февраля 2019

Я занимаюсь разработкой библиотеки в python3x, и у меня возникают некоторые проблемы при попытке импортировать все модули, классы и функции.

    /example.py
    /math/
        __init__.py
        linalg.py
             solve() #inside module.py

Проблема заключается в том, что я хотел бы просто иметь возможность импортироватьмоя библиотека внутри example.py и затем использует все функции, определенные в различных модулях, как это делает numpy, например:

import math as m

m.solve()

вместо использования

import math as m
m.linalg.solve()

или

import math.linalg as m
m.solve()

Как мне определить __init__.py, чтобы включить все таким образом.Я пытался использовать dir (linalg), абсолютный импорт и т. Д., Так как не могу понять, как это сделать.

Thx.

РЕШЕНИЕ :

В конце я создал промежуточный слой для скрытия зависимости модуля.

Внутри __init__.py:

from .linalg import *
from .wrappers import *

затем создал файл wrappers.py вместе сlinalg.py:

from math.linalg import solve

def wrapper_solver():
{
solve()
}

, а затем в example.py:

import math as m

m.wrapper_solver()

Надеюсь, это кому-нибудь поможет.

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

Два решения:

  1. Либо импортируйте весь путь к вашему linalg.py:

example.py:

#!/usr/bin/env python3                                                         

import math.linalg as m # rather than just `import math`.

m.solve()
Либо сделать решение доступным непосредственно из математики с вашим __init __. Py :

math/__init__.py:

from linalg import solve

Редактировать:

Вы можете изменить свой путь к питону, как предложил Мухаммед Аджваир.Но по моему скромному мнению, это не решает проблему.Это вопрос пути импорта.Корневой каталог по умолчанию добавляется в путь Python (при выполнении ./example.py).Этого достаточно, чтобы импортировать все в подкаталоги.Я думаю, что нет необходимости изменять путь.

Редактировать 2:

Если вы хотите импортировать все в вашем __init__.py, вы также можете использовать from math import * (что считается плохой практикой).Или добавьте все вручную в ваш __init__.py.

Но в вашем случае вы можете рассмотреть возможность рефакторинга вашего дерева всего за:

.
|-- example.py
|-- math.py

И забудьте структуру каталогов math.Таким образом, простого import math должно быть достаточно.

Я также хотел бы отметить, что math уже существует в Python.Я думаю, вам следует подумать о переименовании, чтобы избежать конфликта имен.

0 голосов
/ 06 февраля 2019

В вашей linalg.py напишите __ all __ напишите все функции, которые вы хотите выставить для пакета.
пример __ all __ =['solve']

Затем в __ init __.py (модуль, где файл linalg.pyприсутствует) запись в файл from .linalg import * при этом будут импортированы все функции, определенные в __ all __ (имя функции примечания должно быть уникальным).а затем в __ init __.py напишите __ all __ = linalg.__ all __ (используйте +, если есть еще файл, например __ all __ = linalg.__ all __ +file2.__ all __.

, а затем в примере вы можете вызвать solve как from math import solve.

0 голосов
/ 06 февраля 2019

Если вы хотите добавить что-либо в папку, вы должны добавить эту папку в системный каталог.Вы можете сделать это с помощью -

import sys
sys.path.insert(0, '/path/to/math/folder')

import linalg as m

m.solve()

РЕДАКТИРОВАТЬ 1:

ИЛИ

В __init__.py, добавьте

__all__ = ["linalg", "foo", "barr"]

и т. Д., И import math as m в вашем основном скрипте, надеюсь, это поможет.

...