2013-07-29 3 views
-2

У меня есть эта базовая структура проектаИмпорт в питона

/components/__init__.py 
/components/com_auth.py 
/app.py 

Нет! Я хочу импортировать некоторые вариации из app.py в com_auth.

Я пытаюсь сделать как этот

/components/__init__.py 
/components/com_auth.py 
/__init__.py 
/app.py 

Но это, конечно, не работает.

Да, я знаю, что я могу это сделать, как этот

/app.py 
/app/__init__.py     <<<< there i containg varible 
/app/components/__init__.py 
/app/components/parent.py 
/app/components/__init__.py 
/app/components/com_auth.py 

Но как я могу это сделать без него?

+0

да мне лень переделывать около 40 файлов –

+0

тогда лови ответ. – eri

+1

Если вы уменьшите это или голосуете, чтобы закрыть, пожалуйста, введите объяснение (например, дублирующее соединение). В противном случае, это очень распространенная проблема для начинающих Python, поэтому мы должны помочь ему, а не downvote. –

ответ

4

Короткий ответ: Не делайте этого! Независимо от того, что вам нужно знать от app.py, дайте ему как аргумент функции тому, что вы делаете в com_auth.py. Все остальное будет просто испортить вашу программу, запускаясь в круговые зависимости раньше или позже. Старайтесь держать подмодули как можно более независимыми.

+0

I +1 этот, как правило, вы не хотите этого делать (импортируя некоторые из верхнего модуля). Но дело не только в app.py. Это произойдет с пакетами, которые находятся рядом друг с другом. Тогда проблема будет такой же. В этом случае проверьте мой ответ. –

+0

Я согласен с этим ответом, но не является основной проблемой OP, что он не может получить доступ к чему-либо из модуля 'com_auth', так как они находятся в разных папках? –

+0

Он может делать это с абсолютным импортом, но это приведет только к дальнейшим проблемам и дополнительным вопросам о том, как исправить круговые зависимости. Поэтому, я думаю, было бы лучше с самого начала исправить это. Для модулей внутри одной и той же папки, рядом друг с другом, обычным решением было бы иметь еще один подмодуль в этой папке, содержащий общие элементы и импортирующий из нового подмодуля. – Michael

0

Добавить это в основной файл.

import sys 
sys.path.append('..') 
from app import var 
1

Я бы создал пакет, см. Документы here.

Так что-то вроде:

yourpackage/       # Top-level package 
     __init__.py      # Initialize the package 
     app.py 
     components/      # Subpackage 
       __init__.py 
       com_auth.py 

Это то давайте вам доступ к каждому модулю отовсюду в пакете, например, так:

from yourpackage.components import com_auth 
from yourpackage import app 

Чтобы использовать переменную из app.py в com_auth, вы скорее импортирует com_auth в ваш файл app.py, который затем дает вам доступ к функциям, классам и т. д. от com_auth от app.py:

from yourpackage.components import com_auth 

i = 5 
result = com_auth.yourfunction(i) 
+0

, но это было бы сложным и ненужным для простой программы, которая включает в себя около 3 скриптов? –

+1

Правильно, но если есть только 3 скрипта, то вы, вероятно, просто сохраните их в одной папке. –

1

Вы должны убедиться, что app.py на вашем PYTHON PATH.

При выполнении непосредственно python component/com_auth, верхний каталог не в PYTHON PATH (реж только текущий скрипт будет автоматически добавлен в систему PYTHON PATH), и, таким образом, верхние модули, такие как app.py не могут быть импортированы.

Существует два решения вашей проблемы.

Быстрая и грязная (до сих пор я использую его, когда я ленивый, он хорошо работает), то вручную добавить его в PYTHON PATH:

import sys 
import os 

sys.path.append(os.path.dirname(os.path.realpath(__file__))) 

Правильное решение, однако, всегда убедитесь, что точка входа вашей программы находится в вашем верхнем каталоге. Значение com_auth никогда не должно запускаться напрямую, но всегда импортируется из модуля из модуля из модуля ... из корня. И там вы запускаете свой код, делая python point_of_entry.py и никогда не python sub_module/any_other_module.py. В вашем случае, возможно, app.py.

В случаях, когда это невозможно или желательно (команды администратора, модульные тесты и т. Д.), У вас должен быть скрипт с возможностью добавления directoy в PYTHON PATH (это то, что django-admin, nosetest и т. Д.).

Я подозреваю, что вы просто проверяете свой модуль и хотите только быстро его запустить. В этом случае, просто введите:

PYTHONPATH='/path/to/your/project' 

В вашей оболочке, и он будет добавлен в ваш PYTHON PATH для текущего сеанса.

Вы можете исправить свою архитектуру позже.

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