【问题标题】:Python 3: module in same directory as script: "ImportError: No module named"Python 3:与脚本位于同一目录中的模块:“ImportError:未命名模块”
【发布时间】:2015-02-06 12:55:00
【问题描述】:

我正在尝试从 IPython shell 导入一个模块 (venues)。 venues 模块已正确导入,但它随后尝试自行导入名为 makesoup 的模块,但未能成功。

我位于~ 目录中,我正在尝试导入位于子目录processors 中的venues.py 文件。 makesoup.py文件也位于processors子目录中,这意味着它附近的任何Python脚本都应该能够找到它,对吧?

In [1]: import processors.venues
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-1-765135ed9288> in <module>()
----> 1 import processors.venues

~/processors/venues.py in <module>()
      7 """
      8 
----> 9 import makesoup
     10 import re
     11 

ImportError: No module named 'makesoup'

我在~processors 目录中添加了一个空的__init__.py,但未成功。

注意:当我位于 processors 时,makesoup 模块已正确导入,但我知道这不是它应该工作的唯一方式。

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    makesoup.py 文件也位于processors 子目录中,这意味着它附近的任何 Python 脚本都应该能够找到它,对吧?

    没有。此功能 was changed in Python 3 和该语法不再有效。

    import makesoup改成这样:

    from . import makesoup
    

    或者到这个:

    from processors import makesoup
    

    这两种方法都无法直接运行python processors/venues.py,但您仍然可以从您的主目录运行python -m processors.venues

    【讨论】:

    • 谢谢凯文。但是,我不明白为什么这些解决方案会导致无法直接运行venues.py。你能告诉我为什么吗?
    • 如果您使用显式相对导入(我列出的第一个选项),则必须设置 __package__ 魔术变量,但在没有 @987654332 直接运行脚本时,python 不会这样做@。如果使用绝对导入,Python 可能无法找到 processors 包,因为它与脚本不在同一目录中。同样,-m 将解决此问题。
    • 我在迁移到 Python 3 时也没有意识到这个变化。如果你只想在文件中导入一个函数,试试这个from .makesoup import this_function
    • 答案应该用@blaylockbk 评论编辑。为我工作
    • 只是一个小提示,如果你只是想从makesoup导入单个符号,你可以使用:from .makesoup import symbol_from_makesoup
    【解决方案2】:

    有时,这不起作用:

    from . import xxx
    

    也许有人会告诉你在目录下添加init.py。它也不适用于某些特殊情况。

    最有用的方法是首先检查 sys.path:

    import sys
    print(sys.path)
    

    然后你可以找到你应该从哪里导入。

    还有另一种方法:

    import os
    import sys
    sys.path.append(os.path.abspath(os.path.join(os.path.dirname("__file__"), '..')))
    

    或改用插入函数:

    sys.path.insert(0, xxx)
    

    这两种方式适用于小型项目。如果您的项目复杂且庞大,我会建议您选择第一个。

    【讨论】:

      猜你喜欢
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 2019-12-12
      • 2011-11-27
      • 1970-01-01
      • 2013-01-06
      • 2014-10-03
      相关资源
      最近更新 更多