【问题标题】:How do i import from parent directory in python?如何从python中的父目录导入?
【发布时间】:2021-09-08 16:54:34
【问题描述】:

我正在尝试从父文件夹导入。文件夹结构是(忽略名称)

experiments
    __init__.py
    poppy.py
    ostepop
        __ init__.py
        importio.py
   nopop
        __ init__.py
        loggio.py

我尝试将__init__.py添加到每个文件夹,但没有任何影响

import experiments.ostepop.loggio给出错误信息:

ModuleNotFoundError: 没有名为“实验”的模块

from ..experiments import poppy 给了

ImportError: 尝试在没有已知父包的情况下进行相对导入

关于如何从 importio.py 导入 poppy.py 或 loggio.py 的任何提示?

【问题讨论】:

    标签: python python-3.x import python-import importerror


    【解决方案1】:

    他们已经有很多帖子了,但这对我来说仍然是一件棘手的事情。

    所以,虽然我仍然不确定最佳做法是什么,但无论如何我是这样处理这个问题的。

    在要导入的模块中,添加

    import sys
    import os
    sys.path.append(os.path.join(sys.path[0], '..'))
    

    sys.path[0] 是没有文件名的模块的绝对路径。当模块是和不是顶级脚本时,它都可以工作。如果您不知道什么是顶级脚本以及它与导入机制的关系,read this

    os.path.join 用于可能处理系统差异。无论如何,os.path.join(sys.path[0], '..') 会指向父路径。

    sys.path.append将该父路径添加到搜索空间。

    所以,在你的情况下,将之前的代码添加到importio.py,然后你就可以了

    from nopop import loggio
    import poppy
    

    importio.py 中也是如此。

    __init__.py 在此解决方案中根本没有使用。您可以删除它们。 但我看到很多使用__init__.py 的回购。因此,最佳实践可能涉及使用它们。

    【讨论】:

      【解决方案2】:

      如果我理解正确,您想从importio.py 导入poppy.py 并使用文件模型进行调试。在这个模型下,Python解释器不会把它当成一个包,所以这段代码(import experiments.ostepop.loggiofrom ..experiments import poppy)是无效的。

      为了解决这个问题,你可以用包模型调试这个脚本,即在终端中运行python -m experiments。它可能会正确运行。

      【讨论】:

        猜你喜欢
        • 2013-11-09
        • 2019-05-31
        • 1970-01-01
        • 2016-12-27
        • 2012-07-08
        • 2020-03-21
        • 2021-08-15
        • 1970-01-01
        • 2015-07-23
        相关资源
        最近更新 更多