【问题标题】:how to Importing modules python如何导入模块python
【发布时间】:2018-05-05 05:30:53
【问题描述】:

我正在学习如何从目录中导入库,但我偶然发现了一个我似乎无法弄清楚的错误。我在名为 lib 的文件夹中使用 IMDBpy python 库。下面,我正在导入不再返回任何错误的模块,但是当我移至第 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.

【问题讨论】:

    标签: python python-3.x imdbpy


    【解决方案1】:

    你可以写:

    from lib.imdb import IMDb
    
    ia = IMDb()
    

    或:

    from lib import imdb
    
    ia = imdb.IMDb()
    

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

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


    更新:此包使用的导入语句与包文件夹无关,而是与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()
    

    【讨论】:

    • 我已经尝试了您提供的两个示例,但没有成功。我得到了上面的确切错误。
    • 我已经完成了这就是为什么我终于能够导入,这是我面临的第二个障碍。当我运行脚本后,我得到了一个名为 pycache 的新目录和一个名为 init.pyc 的文件。
    • @yusof 我一直在仔细研究imdbpy 包。有趣的是,如果您将所有 import imdb.xxx 类型的导入替换为像 from . import xxx 这样的相对导入,那么一切都会顺利进行。应该把它添加到 sys.path 中,所以 import sys, os 然后 sys.path.insert(0, 'absolute/path/to/lib')
    【解决方案2】:

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

    检查此以获得更好的示例:Python 3 modules

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 2016-07-08
      • 2015-04-02
      • 2018-11-08
      相关资源
      最近更新 更多