在Python 3中,如何从当前目录中的文件导入?

在Python 3中,如何从当前目录中的文件导入?,python,python-3.x,python-3.4,Python,Python 3.x,Python 3.4,在python 2中,我可以创建如下模块: parent ->module ->__init__.py (init calls 'from file import ClassName') file.py ->class ClassName(obj) """__init__.py""" from file import ClassName """file.py""" class ClassName(object): ...etc etc 这是有效的。在P

在python 2中,我可以创建如下模块:

parent
->module
  ->__init__.py (init calls 'from file import ClassName')
    file.py
    ->class ClassName(obj)
"""__init__.py"""
from file import ClassName

"""file.py"""
class ClassName(object): ...etc etc
这是有效的。在Python3中,我可以从命令解释器中执行相同的操作,并且它可以工作(编辑:这可以工作,因为我在运行解释器的同一目录中)。但是,如果我创建_uu _uu _uu.py并像这样做:

parent
->module
  ->__init__.py (init calls 'from file import ClassName')
    file.py
    ->class ClassName(obj)
"""__init__.py"""
from file import ClassName

"""file.py"""
class ClassName(object): ...etc etc

我收到ImportError:无法导入名称“ClassName”,它根本看不到“file”。它将在我导入模块时立即执行此操作,即使我可以通过直接引用它来导入所有内容(我不想这样做,因为它与代码库的其余部分完全不一致)。提供了什么?

尝试通过以下方式导入:

from .file import ClassName

请参阅有关Python3中导入的“Guido的决定”的更多信息,以及关于如何在Python3中导入的完整示例

在python 3中,所有导入都是绝对的,除非给出了从中执行导入的相对路径。您需要使用绝对导入或相对导入

绝对进口:

from parent.file import ClassName
相对进口:

from . file import ClassName
# look for the module file in same directory as the current module

这是可行的,我想这是某种搜索路径问题。把它记在“我们在Python3中更改的内容列表中只是因为”上。非常感谢。这是一个很好的更改。这意味着您可以拥有与python核心库中的基本模块同名的子模块,例如
mymodule.io
,并且
io
的所有导入都已完全指定,python不会随意导入错误的模块,因为导入路径列表的顺序已更改。是的,我想这是真的,对我来说,除非重新实现,否则无论如何都要避免将模块命名为与基本模块相同的名称,但我可以看出避免“oops我们导入了错误的模块”是多么有用。在gRPC自动生成代码()的上下文中,我有一个类似的问题。我想知道为什么gRPC没有生成此答案(或PEP-328)中所示的“正确”代码?没关系,我找到了一个好答案,并在其他问题评论中发布,谢谢。