【问题标题】:How do I import from a file in the current directory in Python 3?如何从 Python 3 的当前目录中的文件导入?
【发布时间】:2019-12-04 09:57:57
【问题描述】:

在 python 2 中,我可以创建这样的模块:

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

这行得通。在 python 3 中,我可以从命令解释器执行相同的操作,并且它可以工作(编辑:这有效,因为我在运行解释器的同一目录中)。但是,如果我创建 __ init __.py 并执行相同的操作:

"""__init__.py"""
from file import ClassName

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

我得到 ImportError: cannot import name 'ClassName',它根本看不到 'file'。它会在我导入模块后立即执行此操作,即使我可以通过直接引用它来导入所有内容(我不想这样做,因为它与我们的代码库的其余部分完全不一致)。什么给了?

【问题讨论】:

    标签: python python-3.x python-3.4


    【解决方案1】:

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

    绝对导入:

    from parent.file import ClassName
    

    相对导入:

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

    【讨论】:

    • 那行得通,认为这是某种搜索路径问题。将其归结为“我们在 python 3 中更改的内容列表只是因为”。非常感谢。
    • 这是一个很好的改变。这意味着您可以拥有与 python 核心库中的基本模块同名的子模块,例如。 mymodule.ioio 的所有导入都已完全指定,python 不会随意导入错误的模块,因为要导入的路径列表的顺序已更改。
    • 是的,我想这是真的,对我来说,将一个模块命名为与基本模块相同的名称是不惜一切代价避免的,除非你重新实现它,但我可以看到如何避免'oops we import the wrong模块'会非常有用。
    • 我在 gRPC 自动生成代码 (stackoverflow.com/questions/57213543/…) 的上下文中也有类似的问题。我想知道为什么 gRPC 没有生成此答案(或 PEP-328)中所示的“正确”代码?
    • 没关系,我找到了一个很好的答案并发布在其他问题 cmets 中,谢谢。
    【解决方案2】:

    尝试以这种方式导入:

    from .file import ClassName
    

    请参阅here 更多关于“Guido 的决定”关于在 python 3 中导入的信息以及关于如何在 python 3 中导入的完整示例。

    【讨论】:

      猜你喜欢
      • 2015-09-24
      • 2022-08-22
      • 2018-12-29
      • 1970-01-01
      • 2020-07-26
      • 1970-01-01
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多