Python 如何处理具有相同名称的模块和包?

假设我有一个模块 foo.py和一个包 foo/

import foo

如何指定要加载的模块或包?

26148 次浏览

我相信包裹总是会被装满的。据我所知,你不能绕过这个。因此,要么更改包名称,要么更改模块名称。医生: http://docs.python.org/tutorial/modules.html#the-module-search-path

实际上,通过手动引导导入机器使用 .py文件而不是目录,这是可能的。(这段代码没有经过很好的测试,但似乎可以工作)。UPDATE2020: 注意,这需要使用定制的 import_module()函数而不是普通的 import语句。但是,使用现代的 Python 3及其 importlib,可能也可以使纯 import语句以同样的方式工作。(注意,这个答案显示了 Python 提供的灵活性。它是 没有,鼓励您在应用程序中使用它。只有在你知道自己在做什么的情况下才能使用它。)

文件 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):
...

文件 foo/subfoo.py:

class SubBar(object):
...

文件 mymodule.py:

from foo import Bar
from foo.subfoo import SubBar