如何导入模块 python

how to Importing modules python

我正在学习如何从目录中导入库,但我偶然发现了一个我似乎无法弄清楚的错误。我在名为 lib 的文件夹中使用 IMDBpy python 库。下面,我正在导入不再 returns 任何错误的模块,但是当我移动到第 6 行时,我收到以下错误:

Traceback (most recent call last):
  File "testlib.py", line 4, in <module>
    from lib.imdb import IMDb
  File "/home/user/Scripts/test/lib/imdb/__init__.py", line 49, in <module>
    import imdb._logging
ImportError: No module named 'imdb'

Python 正在抛出错误,因为我正在编写的 python 测试文件在 2 个目录之上。不知道如何在不将所有内容都放在同一目录下的情况下使其工作。

#!/usr/bin/env python3

from lib.imdb import IMDb

# Create the object that will be used to access the IMDb's database.
ia = imdb.IMDb() # by default access the web.

您可以写:

from lib.imdb import IMDb

ia = IMDb()

或:

from lib import imdb

ia = imdb.IMDb()

但是导入 IMDb 然后调用 imdb.IMDb() 不起作用。

还有一点要提:如果您的 testlib.py 位于 lib 文件夹之上,那么您需要添加一个 __init__.py 文件在 lib 内,以便您的导入工作。该文件可以完全为空。


更新:这个包使用的导入语句不是相对于包文件夹,而是相对于 sys.path 中的任意文件夹。这方面的一个例子是导致错误的确切行:

# imdb.__init__.py
imdb._logging

仅当包驻留在属于 sys.path 的文件夹中时才有效,因此要么与执行 from imdb import IMDb 语句的脚本位于同一路径,要么位于 python dist-package 路径(简化说明)。这个和所有等效的导入可以被替换为

# imdb.__init__.py
from . import _logging

在这种情况下,导入是相对于模块的,因此 imdbpy 包不需要驻留在 sys.path.

中的目录中

我们现在的结果是,我们不能简单地将imdb放在一个子文件夹中,我们需要将它放在sys.path的文件夹中,或者将它所在的文件夹添加到sys.path ].所以,选项是:

  • 安装包
  • 将 imdb 文件夹上移到当前文件夹中
  • 写入:

    import sys
    sys.path.insert(0, 'absolute/path/to/lib')
    

    在导入语句之前。

在上述任何一种情况下,您都可以这样做:

from imdb import IMDb
ia = IMDb()

如上所述,导入对象和导入函数是不同的。 当您导入诸如 imdb 之类的模块时,您可以使用它的功能。但是,当您导入一个函数时,您只能使用该函数,而不能使用它来自的object/module。

检查这个以获得更好的例子:Python 3 modules