2016-05-25 5 views
2

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

У меня есть следующая иерархия каталогов.

----a 
-------__init__.py 
--------------aa 
------------------aa.py 
------------------__init__.py 
--------------bb 
------------------bb.py 
------------------__init__.py 
-------a.py 

Я хотел был бы сделать следующее.

  1. Чтобы импортировать bb.py и aa.py из файла a.py-- осуществляется с помощью __init__.py в каждой директории папки
  2. Чтобы импортировать bb.py из aa.py (Не работает)
  3. Чтобы импортировать a.py из aa.py (не работает)

глядя на многих решений я поместил файл __init__.py внутри каждой директории папки.

я использовал:

import imp 

foo = imp.load_source('module.name', 'path to the file') 

Это работало, но так как путь должен быть жестко закодирован Я не уверен, если это будет жизнеспособным решением в моем случае

В настоящее время я делаю импортирует, добавив путь к каталогам sys. Я бы хотел, чтобы решение было более динамичным.

Иерархия папок моего проекта углубляется до 6-7 уровней поддиректорий и мне нужно решение импортировать модуль на уровне 1 от уровня 7.

Я буду рад, если кто-то может указать на что мне не хватает.

+1

Вы, вероятно, хотите, чтобы назвать ваши файлы инициализации [ '__init__. py'] (https://docs.python.org/3/tutorial/modules.html#packages). – Evert

+2

«Иерархия папок моего проекта проходит до 6-7 подкатегорий уровней». Упрощенное суждение, но это просто плохо; вы можете переосмыслить свою структуру. – Evert

+0

Файлы инициализации названы правильно. Я не знаю, когда я набираю __ с init, __ автоматически удаляется. – Sam

ответ

1

Какая точка входа в приложение? Если, например, вы запускаете из командной строки файл aa.py, вам не повезло.

«просмотры Guido работает сценарии в пакете в качестве анти-паттерна» (отвергнут PEP-3122)

Точка входа вас пакет должна быть где-то в корне пакета. В вашем случае это файл a.py. Оттуда вы импортируете некоторые внутренние модули, как обычно:

# contents of a.py 
from aa import a 

Теперь об импорте из вашей упаковки.

Предположим, что есть еще один файл aa1.py в том же каталоге, что и aa.py. Для того, чтобы импортировать его из aa.py вы можете использовать относительные функции импорта

# contents of aa.py 
from . import aa1 

Здесь . средства «в том же каталоге».

Другие примеры:

# contents of aa.py 
from .. import a # here .. means "one level above" 
from ..bb import bb # this will import your bb.py module 

Пожалуйста, обратите внимание, что все, что импорт потерпит неудачу, если, например, вы запустите из командной строки непосредственно aa.py!

UPDATE:

. и .. в приведенных выше примерах не являются именами каталогов. Это синтаксис питона сказать «тот же уровень», «один уровень выше», и т.д. Если вам необходимо импортировать из 3-х уровней выше, вы должны написать:

from .... import my_module 
+0

Привет, Лесник, спасибо за Ответ. Тем не менее, решение здесь будет работать в этом случае в частности. Как мне заняться, когда мне нужно импортировать файл на уровне 1 из файла, который находится на уровне 4 или 5 – Sam

+0

Поскольку проект еще не выпущен, мне приходится отлаживать некоторые модули. Поэтому точка входа может быть в любой точке. – Sam

+0

Точка входа должна быть на уровне корня. Я думаю, что есть причина, почему это необходимо. F.E. вы начинаете с aa.py и импортируете некоторый модуль aa1, который находится на том же уровне, что и aa. Название модуля будет «aa1». Теперь вы импортируете некоторый модуль сверху (a.py), этот модуль снова импортирует вам aa1.py. Теперь это имя будет aa.aa1. Это не хорошо. Все ваши модули внутри пакета должны иметь постоянные имена. Схема именования, используемая в python: package_name.subdir1.subdir2.module_file_name. Вам нужно импортировать модуль с 4 уровней выше: написать «from ..... import my_module» – lesnik

Смежные вопросы