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

Cha*_*net 44 python import module package

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

import foo
Run Code Online (Sandbox Code Playgroud)

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

zee*_*kay 21

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

  • 您好,请为您的申诉提供参考?我没有在文档链接中看到任何内容,该内容表明总是优先于模块加载软件包。 (2认同)
  • 这个答案是不正确的。链接的文档(适用于 Python 2 和 3)声明当前脚本的目录在搜索顺序中具有优先权。另见:http://python-notes.curiousefficiency.org/en/latest/python_concepts/import_traps.html#the-name-shadowing-trap (2认同)

abb*_*abb 14

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

文件 foo.py

print "foo module loaded"
Run Code Online (Sandbox Code Playgroud)

文件 foo/__init__.py

print "foo package loaded"
Run Code Online (Sandbox Code Playgroud)

文件 test1.py

import foo
Run Code Online (Sandbox Code Playgroud)

文件 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')
Run Code Online (Sandbox Code Playgroud)

运行

$ python test1.py 
foo package loaded

$ python test2.py 
foo module loaded
Run Code Online (Sandbox Code Playgroud)


ste*_*ppo 10

也许你想将你的课程从foo.py模块转移到__init__.py.

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

档案foo/__init__.py:

class Bar(object):
...
Run Code Online (Sandbox Code Playgroud)

档案mymodule.py:

from foo import Bar
from foo.subfoo import ...
Run Code Online (Sandbox Code Playgroud)

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

  • 我想知道是否可以这样做. (2认同)
  • Lennart Regebro在另一个答案推荐它,所以没关系:http://stackoverflow.com/a/17530651/992687 (2认同)