2016-10-30 4 views
1

Имеет некоторые проблемы с импортом модулей в python. Это моя структураМетод импорта из __init__.py

my_app/ 
    app.py 
    __init__.py (I want to import a function from this file) 
    folder1/ 
     __init.py 
     method1.py 
    folder2/ 
     __init__.py 
     method.py 

папки В моем корне __init__.py У меня есть эта функция

def want_to_be_run_elsewhere(): 
    pass 

В моем app.py, я хочу, чтобы импортировать эту функцию и запустить его, когда я начинаю мое заявление, но я Не уверен, как это сделать.

from my_app import want_to_be_run_elsewhere 

Это бросает не модуль с именем my_app

Из того, что я могу сказать, я все необходимые __init__.py файлы, так что, возможно, это может быть sys.path связаны?

Я читал некоторые подобные темы здесь, но я не смог это решить.

+0

Есть 'app.py' и' __init __. Py' внутри 'my_app /' или нет? –

+0

Извините за неряшливость. Да 'app.py' и' __init __. Py' находится внутри my_app/и 'app.py' - это моя точка входа –

+0

FWIW, обычно нет определения функций внутри файла' __init __. Py'. Они обычно пусты или просто имеют в них список '__all__'. –

ответ

0

Обычно вы могли бы сделать импорт, как

from . import want_to_be_run_elsewhere 

это здесь не работает, потому что вы звоните app.py. Если вы импортируете my_app.app, это часть модуля. Если вы это называете, это не так. Импорт из модуля, который используется при использовании ., не будет работать.

Вы можете либо переместить app.py за пределы my_app, удалив его из модуля и снова импортируя импорт.

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

from __init__ import want_to_be_run_elsewhere 

в app.py

Я считаю

from my_app import want_to_be_run_elsewhere 

будет работать только если у вас есть на самом деле pip install -e my_app/. Тогда это тоже должно сработать.

+0

В качестве альтернативы, вызывается 'app.py' в качестве модуля в пакете: из dir ** выше **' my_app', вызовите 'python -m my_app.app' или' python3 -m my_app.app '. См. Http://stackoverflow.com/a/11536794/674064 –

+0

Интересно! вам придется попробовать это –

+1

Я бы удалил предложение использовать 'from __init__ import ...'. Это неправильный способ делать что-то. Он может даже сломать код, если какой-либо код в подмодулях зависит от имени пакета (например, если вы используете такие модули, как 'pickle' напрямую или' shleve' и т. Д., Используя это решение, это сделает данные нечитабельными). – Bakuriu

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