Как python работает с модулем и пакетом с одинаковым именем? - PullRequest
41 голосов
/ 18 июня 2011

Предположим, у меня есть модуль foo.py и пакет foo/.Если я позвоню

import foo

, какой из них будет загружен?Как мне указать палочку для загрузки модуля или пакета?

Ответы [ 3 ]

22 голосов
/ 18 июня 2011

Я считаю, что пакет всегда будет загружен.Вы не можете обойти это, насколько я знаю.Поэтому измените либо пакет, либо имя модуля.Документы: http://docs.python.org/tutorial/modules.html#the-module-search-path

14 голосов
/ 14 июня 2012

На самом деле, это возможно (этот код плохо проверен, но, кажется, работает).

Файл foo.py

print "foo module loaded"

Файл foo/__init__.py

print "foo package loaded"

Файл test1.py

import foo

Файл test2.py

import os, imp

def import_module(dir, name):
    """ load a module (not a package) with a given name 
        from the specified directory 
    """
    for description in imp.get_suffixes():
        (suffix, mode, type) = description
        if not suffix.startswith('.py'): continue
        abs_path = os.path.join(dir, name + suffix)
        if not os.path.exists(abs_path): continue
        fh = open(abs_path)
        return imp.load_module(name, fh, abs_path, (description))

import_module('.', 'foo')

Запуск

$ python test1.py 
foo package loaded

$ python test2.py 
foo module loaded
10 голосов
/ 04 октября 2012

Возможно, вы захотите переместить ваши классы из модуля foo.py в __init__.py.

Таким образом, вы сможете импортировать их из пакета, а также импортировать дополнительные подпакеты:

Файл foo/__init__.py:

class Bar(object):
...

Файл mymodule.py:

from foo import Bar
from foo.subfoo import ...

Тем не менее, я бы хотел, чтобы кто-нибудь еще раз проверил этот подход и дал мне знать, если он правильный или__init__ модуль не должен использоваться таким образом.

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