2016-04-10 2 views
4

Я всегда использовал Python для однофайловых скриптов, и теперь я работаю над своим первым «сложным» проектом, поэтому у меня нет опыта с пакетами в Python (3.x).Каков правильный способ обработки импорта в сложном проекте Python?

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

Предполагая, что следующий проект дерево:

myProject/ 
- subpackage1/ 
    - __init__.py 
    - other1.py 
- subpackage2/ 
    - __init__.py 
    - other2.py 
- __init__.py 
- foo.py 
- bar.py 

Какой правильный способ импорта модулей друг от друга? В частности:

  1. импорт foo из bar
  2. импортера foo от other1
  3. импортера other1 из other2
  4. импортом foo (который является библиотекой) из другого каталога во время развития (виртуальные среды правильный выбор?)

Спасибо!

EDIT: (чтобы уточнить вопрос) Я, очевидно, пробовал разные подходы, прежде чем спрашивать. То, что я видел в некоторых популярных проектах, использует абсолютный импорт, такой как from myProject.subpackage1.other1 import something. Это похоже на чистое решение (похоже на то, что я привык делать на Java), но, приняв этот подход, я не могу просто запустить свой код из-за ошибок импорта. Может ли virtualenv быть решением для установки пакетов, прежде чем пытаться их импортировать?

ответ

2

1. Импорт foo из bar

Как the tutorial говорит, вы можете импортировать модули из одной и той же директории, импортируя from .. Например:

from . import foo 

Если bar выполняется с python bar.py то вы также можете импортировать его абсолютно, как и любой другой модуль:

import foo 

Это работает, так как родительский каталог исполняемого файла добавляется к путь поиска модуля (sys.path/PYTHONPATH). Однако я не буду полагаться на это поведение, поскольку это означает разные вещи для импортированных модулей и основного модуля.

2. Импорт foo из other1

Если вы используете относительный синтаксис импорта, то вы можете добавить еще один . означает родительский каталог:

from .. import foo 

3.Импорт other1 из other2

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

from ..subpackage1 import other1 

4. Импорт foo (а библиотека) с носителя другой каталог во время разработки

Я предполагаю, что под «другим справочником» вы подразумеваете «другой проект». В таком случае, да, вы хотите упаковать foo в качестве пакета distutils/setuptools, а затем установить его в virtualenv для другого проекта.

Как это сделать, это немного более важно для сообщения, которое уже довольно долгое время, но сайт setuptools имеет довольно приличный tutorial для этого.

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