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

时间:2011-06-18 04:26:14

标签: python import module package

假设我有一个模块foo.py和一个包foo/。如果我打电话

import foo

将加载哪一个?如何指定我的魔杖加载模块或包?

3 个答案:

答案 0 :(得分:22)

我相信包总是会被加载。据我所知,你无法解决这个问题。因此,请更改包或模块名称。文档:http://docs.python.org/tutorial/modules.html#the-module-search-path

答案 1 :(得分:13)

实际上,这是可能的(这段代码没有经过良好测试,但似乎有效)。

档案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

答案 2 :(得分:10)

也许您希望将班级从foo.py模块移至__init__.py

这样您就可以从包中导入它们以及导入可选的子包:

档案foo/__init__.py

class Bar(object):
...

档案mymodule.py

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

尽管如此,我希望有人仔细检查这种方法并让我知道它是否正确或__init__模块不应该像这样使用。