У меня есть пакет под названием foo. Он организован следующим образом:
package_dir/foo/foo.py
package_dir/foo/utils.py
package_dir/foo/other.py
package_dir/foo/__init__.py
Возможно, мне следовало назвать foo.py как-нибудь иначе, но эта библиотека со временем росла и развивалась, теперь поддерживает другие вещи и используется повсюду. Пакет собран и хранится на нашем внутреннем pipy-сервере, поэтому при установке я получаю /usr/lib/python2.7/site-packages/foo.
Как лучше всего импортировать из этого пакета?
В настоящее время я делаю это:
import foo
Затем я делаю это в клиентском коде:
foo.foo.myfunction()
Для использования этого подхода можно использовать множество классов и функций:
from foo import blah, blah, blah
Это становится немного глупо. Это питонический подход к пакетам? Есть лучший способ это сделать?
Спасибо за любую помощь.
* Обновить *
Итак, я сделал это, но не нашел свои функции:
from __init__.py:
import foo
import utils
import other
Затем я импортирую вот так:
import foo
Затем в моем коде я пробовал:
foo.myfunc()
А также:
myfunc()
Оба жалуются:
AttributeError: 'module' object has no attribute 'myfunc'






У вас есть несколько вариантов:
from foo import foo
foo.myfunction()
Или же
from foo import foo as something
something.myfunction()
Или же
import foo.foo as something
something.myfunction()
Или вы можете «продвигать» некоторые API, чтобы они публиковались с верхнего уровня. Импортируйте их в foo/__init__.py, а затем вы можете использовать их из объекта пакета. Например, ваш новый foo/__init__.py может быть:
from .foo import myfunction
Обратите внимание на явный синтаксис относительного импорта, чтобы избежать двусмысленности между пакетом верхнего уровня foo и вложенным пакетом foo.
Тогда вы можете написать:
import foo
foo.myfunction()
и так далее.
Милый, я поиграю с их продвижением в в этом.py, это кажется лучшим вариантом для моих вещей.
@BenH В stdlib есть примеры этого, на которые стоит обратить внимание. (Не то чтобы это было трудно понять как, но это примеры того, когда это делать и какие имена нужно «продвигать».) Я не помню, какие модули были у меня в голове, но вы можете добраться до источник для stdlib, перейдя к документации по большинству модулей, щелкнув ссылку «источник» вверху и исследуя ее оттуда.
Я не могу заставить этот подход работать, см. Мое обновление выше. Спасибо
добавлен пример __init__.py
import foo as something_else?