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

Posted

技术标签:

【中文标题】python如何处理具有相同名称的模块和包?【英文标题】:How python deals with module and package having the same name? 【发布时间】:2011-09-17 15:24:59 【问题描述】:

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

import foo

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

【问题讨论】:

pythons 导入系统是一个彻头彻尾的讽刺。 【参考方案1】:

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

【讨论】:

您好,您可以为您的索赔提供参考吗?我在提供的文档链接中没有看到任何内容表明包将始终优先于模块加载。 这个答案不正确。链接的文档(适用于 Python 2 和 3)声明当前脚本的目录在搜索顺序中具有优先权。另见:python-notes.curiousefficiency.org/en/latest/python_concepts/… 根据我的经验,虽然文档说包比模块更受欢迎,但事实并非如此,至少在 python 2.7 中是这样。似乎在 Python 2.7 中 import 会在父(但不是子)目录中寻找模块,直到找到它,所以在解析结束时将检查 已安装的包【参考方案2】:

实际上,可以通过手动引导导入机制使用.py 文件而不是目录。 (这段代码没有经过很好的测试,但似乎可以工作)。 2020 年更新:请注意,这需要使用自定义 import_module() 函数而不是普通的 import 语句。但是,对于现代 Python3 及其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

【讨论】:

因此,可以通过手动破解导入的处理方式。这很好,也是一个有价值的答案。但请注意,通过手动破解,几乎一切皆有可能。所以,我倾向于编辑这个答案,以强调“手动黑客”方面。 另请注意,在适当的级别进行黑客攻击(importlib import hooks),可以使裸import foo 优先使用foo.py 模块而不是foo/包。【参考方案3】:

也许您想将您的课程从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

【讨论】:

我也想知道这样做是否可以。 Lennart Regebro 在另一个答案中推荐了它,所以没关系:***.com/a/17530651/992687 简单,优雅,可能是这里唯一的python-ish解决方案

以上是关于python如何处理具有相同名称的模块和包?的主要内容,如果未能解决你的问题,请参考以下文章

jquery ajax请求时如果页面卡主 多次发出相同请求 如何处理

在多个 AWS Lambda 中处理相同的函数名称

在 Rails 中,如何处理多个选中的复选框,只在 , 或?

如何处理网址中的日文名称?

如何处理名称冲突 collections.Counter 和 typing.Counter?

如何组织我的python模块和包