Python的导入类具有相同的名称,目录[复制](Python Import Class With

2019-09-01 06:09发布

这个问题已经在这里有一个答案:

  • Python的导入优先级:包或模块? 4个回答

可以说,我有以下Python源文件格式:

lib/foo.py
lib/foo/bar.py

然后在我的源代码:

from foo import gaz

我得到一个导入错误:

ImportError: No module named foo

怎样才可以有一个.py文件,并与同名的目录,这样我可以做到以下几点:

 from foo import gaz
 from foo.bar import wakawaka

提前致谢!

Answer 1:

您有,使用单一进口的实际问题,是由于包有过模块的优先级:

请注意,使用时from package import item中,项目可以是在封装的子模块(或子包),或在包中定义的,像一个函数,类或变量其它名称。 在import语句首先测试的项目是否在包中定义; 如果没有,它假定它是一个模块,并尝试加载它。 如果没有找到它,一个ImportError异常。

反正我强烈建议重命名文件或因为你不能使用相同的名字导入多个模块的目录。 出现该问题是因为每个模块/包对象被存储到sys.modules ,这是一个简单的dict ,因此它不能包含多个相等的键。

具体而言,假设foo.pyfoo目录在不同的目录(如果他们是不是你仍然不能导入foo.py ),当这样做的:

from foo import gaz

这将加载foo.py并把模块插入sys.modules ,然后尝试做:

from foo.bar import wakaka

因为进口尝试使用该模块将失败foo.py而不是包装。

恰好相反,如果你第一次导入foo.bar ; 进口将使用软件包,而不是模块。



Answer 2:

我敢肯定这是不是你应该做的,但你可以强制Python中导入特定的文件作为一个模块小鬼 :

import imp

with open("foo.py") as source:
    foo = imp.load_module("foo", source, "./", ('', '', imp.PY_SOURCE))

现在你可以这样做:

gaz_instance = foo.gaz()


文章来源: Python Import Class With Same Name as Directory [duplicate]