2017-01-15 5 views
2

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

\mainModule 
    __init__.py 
    main.py 
    \subModule_1 
     __init__.py 
     someCode_1.py 
     someCode_2.py 
    \subModule_2 
     __init__.py 
     otherCode.py 

Я хочу, чтобы иметь возможность запустить следующий код из main.py:

>>> from subModule_1 import someCode_1 
>>> someCode_1.function() 
"Hey, this works!" 
>>> var = someCode_2.someClass("blahblahblah") 
>>> var.classMethod1() 
>>> "blah blah blah" 
>>> from subModule2 import otherCode 
>>> otherCode("runCode","#ff281ba0") 

Однако, когда я пытаюсь импортировать someCode_1, например, она возвращает AttributeError, и я не совсем уверен, почему. Это связано с файлом __init__.py?

ПЕРЕСМОТРЫ
  • Minimal, полный и поддающийся проверке (я надеюсь ...)

    \mainDir 
        __init__.py # blank file 
        main.py 
        \subDir 
         __init__.py # blank file 
         codeFile.py 
    

    Используя это ...

    #main.py file 
    import subDir 
    subDir.codeFile.function() 
    

    И это ...

    #codeFile.py file 
    def function(): 
        return "something" 
    

    ... это возвращает ту же проблему, упомянутой выше **.

** Точная ошибка:

Traceback (most recent call last): 
    File "C:\...\mainDir\main.py", line 2, in <module> 
    subDir.codeFile.function() 
AttributeError: module 'subDir' has no attribute 'codeFile' 

Кредитов @jonrsharpe: Спасибо за показывая мне, как правильно использовать переполнение стека.

+2

Пожалуйста обеспечивают [mcve]. Также вы говорите, что хотите запустить интерактивный сеанс * из «main.py'» *, что не совсем понятно. – jonrsharpe

+1

Может быть вызвано некоторым кодом уровня модуля в 'someCode_1', который выполняется при импорте. Каково точное сообщение об ошибке? – schwobaseggl

+0

@jonrsharpe К сожалению, я имел в виду компиляции и запуска 'main.py' с помощью переводчика (извините, новобранец ошибка) – BUZZYSIN

ответ

1

У вас есть два варианта, чтобы сделать эту работу.

Либо это:

from subdir import codeFile 
codeFile.function() 

Или:

import subdir.codeFile 
subdir.codeFile.function() 
+0

Да, это работает отлично, спасибо – BUZZYSIN

1

Когда вы import subDir, он делает три вещи:

  1. выполняет код в mainDir/subDir/__init__.py (т.е. в данном случае не ничего, потому что этот файл пуст)
  2. импортирует полученный модуль под названием subDir локально , что в свою очередь сделает его атрибутом модуля mainDir;
  3. регистрирует новый импорт по всему миру в словаре sys.modules (потому что import выполняется от родительского модуля mainDir, имя заполняется до 'mainDir.subDir' для целей настоящей регистрации);

Что она делает не делать, потому что не было сказано, это импортировать subDir.codeFile. Поэтому код в codeFile.py не был запущен, а имя codeFile еще не импортировано в пространство имен mainDir.subDir. Следовательно, при попытке доступа к нему вызывается AttributeError.Если бы вы добавить следующую строку в mainDir/subDir/__init__.py тогда он будет работать:

import codeFile 

В частности, это:

  1. запустить код в codeFile.py
  2. добавить результирующий модуль как атрибут mainDir.subDir модуль
  3. хранить ссылку на него как еще одну запись в sys.modules, на этот раз под названием mainDir.subDir.codeFile.

Вы также мог бы достичь того же эффекта от высшей до иерархии модулей, говоря import subDir, subDir.codeFile вместо того, чтобы просто import subDir в вашем mainDir.main исходном файле.

NB: При тестировании из командной строки или IDE, убедитесь, что ваш текущий рабочий каталог (опрашивается os.getcwd(), изменен с помощью os.chdir(wherever)) не является ни mainDir, ни subDir. Работа из другого места - например. родительский каталог mainDir. Работа внутри модуля приведет к неожиданным результатам.

+0

Это имеет такой смысл: я исправляю это сейчас, чтобы заставить его работать (я понятия не имел, как на самом деле работает ключевое слово import, но для меня это очень много дышит) – BUZZYSIN

+0

Вопрос - если бы я не хотел чтобы моя текущая рабочая директория была 'main.py' (которую вы точно догадались бы),« где »я должен запустить интерпретатор? Это даже _matter_? – BUZZYSIN

+0

К сожалению, у меня возникла ошибка при вводе 'import codeFile' в' mainDir \ subDir \ __ init __. Py': 'ModuleNotFoundError: Нет модуля с именем 'codeFile'' – BUZZYSIN

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