Как python работает с модулем и пакетом с одинаковым именем?

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

import foo

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

3 ответа

Решение

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

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

файл 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

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

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

файл foo/__init__.py:

class Bar(object):
...

файл mymodule.py:

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

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

Другие вопросы по тегам