2012-01-21 3 views
54

Я хочу импортировать подпапки в качестве модулей. Поэтому каждая подпапка содержит __init__.py. Моя структура папок, как это:Импорт модуля из подпапки

src\ 
    main.py 
    dirFoo\ 
    __init__.py 
    foofactory.py 
    dirFoo1\ 
     __init__.py 
     foo1.py 
    dirFoo2\ 
     __init__.py 
     foo2.py 

В моем основном сценарии я импортировать

from dirFoo.foofactory import FooFactory 

В заводском файле я включать вложенные модули:

from dirFoo1.foo1 import Foo1 
from dirFoo2.foo2 import Foo2 

Если я называю мой FooFactory я получить ошибку, что python не может импортировать подмодули foo1 и foo2:

Traceback (most recent call last): 
    File "/Users/tmp/src/main.py", line 1, in <module> 
from dirFoo.foofactory import FooFactory 
    File "/Users/tmp/src/dirFoo/foofactory.py", line 1, in <module> 
from dirFoo1.foo1 import Foo1 
    ImportError: No module named dirFoo1.foo1 

ответ

79

Там нет необходимости возиться с вашим PYTHONPATH или sys.path здесь.

Чтобы правильно использовать абсолютный импорт в пакете вы должны включать в себя «корень» имяпакета а и т.д .:

from dirFoo.dirFoo1.foo1 import Foo1 
from dirFoo.dirFoo2.foo2 import Foo2 

Или вы можете использовать relative imports:

from .dirfoo1.foo1 import Foo1 
from .dirfoo1.foo1 import Foo2 
+24

Одна вещь, чтобы помнить! добавьте '__init __. py' в каждую подпапку, с которой вы импортируете. –

+3

Пустой '__init __. Py' может выполнить эту работу. – cerebrou

+0

Что будет синтаксис, если ранее 'Foo1' был в родительском каталоге и один закодировал что-то вроде' from Foo1 import * '. Есть ли способ достичь такого же эффекта, поэтому вам не нужно приписывать все «Foo1»? – jxramos

3

Установите переменную окружения PYTHONPATH. Например, как этот PYTHONPATH =.: .. (для семейства * nix).

Также вы можете вручную добавить текущую директорию (Src в вашем случае) PYTHONPATH:

import os 
import sys 
sys.path.insert(0, os.getcwd()) 
4

Просто уведомить здесь. (от новичка, keviv22)

Никогда и не ради собственного достоинства назовите папки или файлы с пробелами или символами типа «-» или «_». Если вы это сделаете, вы можете столкнуться с несколькими проблемами. например, моя, хотя ваша команда для импорта правильная, вы не сможете успешно импортировать нужные файлы, которые доступны в таких папках с именами.

инвалидного namings папки следующим образом:

  • Generic-классы-папки
  • Generic_Classes_Folder

действительное namings папки для выше:

  • GenericClassesFolder или Genericclassesfolder или genericClassesFolder (или как это без каких-либо пробелов или s пециальные символы из слов)

Какой ошибки я сделал:

рассмотрит структуру файла.

Parent 
    . __init__.py 
    . Setup 
    .. __init__.py 
    .. Generic-Class-Folder 
     ... __init__.py 
     ... targetClass.py 
    . Check 
    .. __init__.py 
    .. testFile.py 

Что я хотел сделать?

  • от testFile.py, я хотел импортировать 'targetClass.py 'в файле Generic-Class-Folder для использования функции с именем «functionExecute» в файле «targetClass.py»

Какая команда я сделал?

  • от 'testFile.py', написал команду, из Core.Generic-класса Folder.targetClass импорта functionExecute
  • Got ошибки типа "SyntaxError: недействительный синтаксис"

Пробовал много поисков и просмотрел много вопросов о стеке и не смог решить, что пошло не так. Я перекрестно проверял файлы несколько раз, я использовал файл __init__.py, вставил путь к среде и очень беспокоился о том, что пошло не так.

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

(извините за огромный пост по этому поводу ... просто позволить мои срывы идут .... :) Спасибо!)

+2

Пробелы и тире («-») вызовут это, но подчеркивания («_») все равно будут работать нормально. – cowlinator

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