Как 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__
модуль не должен использоваться таким образом.