Подтвердить что ты не робот

Python импортирует относительный путь

У меня есть проект, в котором я хотел бы использовать некоторые классы Python, расположенные в других каталогах.

Пример структуры:

/dir
 +../subdirA
 +../subdirB
 +../mydir

Абсолютный путь варьируется, поскольку этот проект выполняется на разных компьютерах.

Когда выполняется мой файл Python с MySampleClass, расположенный в /mydir, как мне импортировать OtherClassRoot, расположенный в /dir, или OtherClassA, расположенный в /subdirA?

Я пробовал такие вещи, как:

from . import MySampleClass as msc

или

from ../ import MySampleClass as msc

но это всегда дает сбой или выдает мне сообщения об ошибках, такие как Попытка относительного импорта в не пакет

Итак, как правильно импортировать файлы Python?

4b9b3361

Ответ 1

Вам понадобится __init__.py в каталоге mydir (и он может быть пустым), а затем, если dir находится в пути sys, если ваш MySampleClass находится в myfile.py и myfile.py находится в mydir

from mydir.myfile import MySampleClass

Если вы хотите импортировать функции верхнего уровня из файла util.py, которые находятся в subdirA в myfile.py(где ваш класс), то __init__.py должен быть в subdirA, а затем в myfile.py

from subdirA.util import somefunc, someotherfunc

То же самое относится к пути sys, то есть вы должны либо начать с 'dir', либо добавить его. Все импортируется с верхнего уровня пакета (обычно это папка проекта).

Однако для тестирования модулей, где вы можете запустить функцию из утилиты в интерпретаторе, если вы начинаете с subdirA, вам нужно будет добавить dir в путь sys, чтобы ваш импорт мог разрешиться.

>>> import sys
>>> sys.path.append('../dir')

но это взломать и было бы предпочтительнее использовать только интерпретатор при тестировании. Вы также можете добавить 'dir' в пакеты вашего сайта в p-м файле.

Чтобы использовать относительный импорт, вам понадобится более глубокая вложенная папка, например subdirA/subdirofA, а затем в subdirofA, которую вы могли бы использовать. для возврата (например, from .subdirB). Действительно, для меня относительный импорт довольно сложно увидеть полезность. Мне лучше использовать прямой импорт по отношению к каталогу проекта, но я мог видеть, что они полезны, если вы хотите вложить наивный подпакет, но опять же лучше быть явным, чем подразумеваемым, если это возможно.

также см. this

Ответ 2

сначала добавьте относительные пути к pythonpath

import os

import sys

cwd = os.getcwd()

sys.path.append(cwd + '/../subdirA/')

sys.path.append(cwd + '/../subdirB/')

затем импортируйте модули.

Ответ 3

Структура dir:

/dir
 +../subdirA
 +../subdirB
 +../mydir

в сочетании с командой linux ln, мы можем сделать вещи намного проще:

1. cd dir/mydir
2. ln -s ../subdirA ./
3. ln -s ../subdirB ./

И теперь, если вы хотите импортировать some_stuff из файла: dir/subdirA/fileA.py в свой файл: dir/mydir/myfile.py, просто импортируйте вот так:

from subdirA.fileA import some_stuff

И, то же самое относится к 'dir/subdirB'

Что еще, это работает для процесса setup.py,:)