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

16 python python-3.x python-3.4

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

parent
->module
  ->__init__.py (init calls 'from file import ClassName')
    file.py
    ->class ClassName(obj)
Run Code Online (Sandbox Code Playgroud)

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

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

"""file.py"""
class ClassName(object): ...etc etc
Run Code Online (Sandbox Code Playgroud)

我得到ImportError:无法导入名称'ClassName',它根本看不到'file'.我会在导入模块时立即执行此操作,即使我可以通过直接引用它来导入所有内容(我不想这样做,因为它与我们的其余代码库完全不一致).是什么赋予了?

Dun*_*nes 26

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

绝对导入:

from parent.file import ClassName
Run Code Online (Sandbox Code Playgroud)

相对进口:

from . file import ClassName
# look for the module file in same directory as the current module
Run Code Online (Sandbox Code Playgroud)

  • 那行得通,认为这是某种搜索路径问题。将其归结为“我们在 python 3 中更改的内容列表只是因为”。非常感谢。 (2认同)
  • 这是一个很好的改变。这意味着您可以拥有与 python 核心库中的基本模块同名的子模块,例如。`mymodule.io` 和 `io` 的所有导入都已完全指定,python 不会任意导入错误的模块,因为要从中导入的路径列表的顺序已更改。 (2认同)

dor*_*oru 17

尝试以这种方式导入:

from .file import ClassName
Run Code Online (Sandbox Code Playgroud)

这里的"圭多的决定"关于在Python 3和完整的例子进口如何在Python 3进口更多的信息.