2015-05-15 2 views
0

У меня возникли трудности с пониманием того, как работает импортер python .. У меня есть скрипт python (fractalDimension.py), который импортирует подмодуль («greedyColoring.py»), используя:Импорт Python не работает, когда файл импортируется

from boxCovering.greedyColoring import * 

Он отлично работает, когда я называю его непосредственно:

python fractalDimension.py 

проблема началась, когда я переехал скрипт в папку и добавил главный скрипт, который импортирует fractalDimension.py, потому что в настоящее время импорта дополнительный модуль boxCovering не работает.

В главном скрипте я называю метод fractalDimension:

import fractality.fractalDimension as fd 

fd.calculate() 

, но когда я бегу

python main.py 

Я получаю следующую ошибку

Traceback (most recent call last): 
File "main.py", line 5, in <module> 
    import fractality.fractalDimension as fd 
File "fractalDimension.py", line 11, in <module> 
    from boxCovering.greedyColoring import * 
ImportError: No module named 'boxCovering' 

макет каталога:

main.py 
fractalDimension/ 
| 
+-- __init__.py 
+-- fractalDimension.py 
+-- boxCovering/ 
    | 
    +-- __init__.py 
    +-- greedyColoring.py 

Оба Файлы инициализации пустые

Почему Питон не может найти модуль boxCovering?

ответ

1

Ошибка связана с тем, что питон ищет пакета верхнего уровня называется boxCovering внутри PYTHONPATH и никто не существует (у вас есть только суб -package внутри текущего каталога, но это ISN» т).

Если вы хотите импортировать подпакет/подмодуль, который вы хотите использовать (п) явный относительный импорт:

from .boxCovering.greedyColoring import * 

Обратите внимание на . (точка) в начале.

В качестве альтернативы использовать абсолютный импорт:

from fractality.fractalDimension.boxCovering.greedyColoring import * 

В python2 импорт позволил неявный относительный импорт, который является то, что вы пытаетесь сделать.В этом случае импорт:

from boxCovering import X 

сделано так, как вы делаете может иметь два разных значения:

  • импорт подпакета boxCovering из fractalDimension пакета
  • импорт верхнего уровня пакет boxCovering

в Python3 (см What's new? и соответствующие PEP 0328) они решили, что такой импорт всегда имеет второе значение. Если вы хотите относительный импорт, вы должны указать явно, поэтому используйте относительный синтаксис, который использует точку в начале имени модуля.

Каждая точка означает перейти в один каталог выше так . означает текущий каталог, а .. означает родительский каталог (как в дорожках UNIX) и т.д.

Вы можете включить эту семантику на python2 добавление:

from __future__ import absolute_import 

в верхней части ваших файлов.

+0

Большое спасибо @Bakuriu за ответ и объяснение. Точка в начале импорта заставляла ее работать. – Hernandcb