Импортировать модуль из подпапки - PullRequest
83 голосов
/ 21 января 2012

Я хочу импортировать подпапки в виде модулей. Поэтому каждая подпапка содержит __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

Если я позвоню в свою фабрику, я получу ошибку, что 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

Ответы [ 5 ]

112 голосов
/ 21 января 2012

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

Чтобы правильно использовать абсолютный импорт в пакете, вы должны также указать имя корневого пакета, например ::10000

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

Или вы можете использовать относительный импорт :

from .dirfoo1.foo1 import Foo1
from .dirfoo1.foo1 import Foo2
17 голосов
/ 27 января 2017

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

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

Недопустимые имена папок, как указано ниже:

  • Generic-Classes-Folder
  • Generic_Classes_Folder

допустимые имена папок для выше:

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

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

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

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', написал команду, from Core.Generic-Class-Folder.targetClass import functionExecute
  • Получил ошибки типа SyntaxError: invalid syntax

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

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

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

5 голосов
/ 21 января 2012

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

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

import os
import sys
sys.path.insert(0, os.getcwd())
1 голос
/ 25 сентября 2018

Скажем, ваш проект структурирован следующим образом:

+---MyPythonProject
|   +---.gitignore
|   +---run.py
|   |   +---subscripts
|   |   |   +---script_one.py
|   |   |   +---script_two.py

Внутри run.py, вы можете импортировать сценарии один и два следующим образом:

from subscripts import script_one as One
from subscripts import script_two as Two

Теперь все еще внутри run.pyвы сможете вызывать их методы с помощью:

One.method_from_one(param)
Two.method_from_two(other_param)
0 голосов
/ 21 декабря 2018

Были проблемы, даже когда init .py существовал в подпапке, и все, что не хватало, это добавить «как» после импорта

from folder.file import Class as Class
import folder.file as functions
...