首页 > 解决方案 > 从同级目录导入 - Python 3.7

问题描述

我已经阅读了一些关于 Python 中的模块和包的文章(包括他们自己的教程),但无法让它在我的项目中正常工作。我正在使用 Python 3.7.5

这是我的目录结构:

framework/
    __init__.py
    build/
    classifiers/
    extraction/
        extractionFile.py
    quality/
    utils/
        utilsFile.py

在 extractFile.py 我有这一行:

from ..utils.utilsFile import functionName

但是当我从提取目录运行extractionFile.py 时,出现以下错误:

Traceback (most recent call last):
  File "extractionFile.py", line 25, in <module>
    from ..utils.utilsFile import functionName
ImportError: attempted relative import with no known parent package

如果我从框架目录运行extractionFile.py,使用:

from utils.utilsFile import functionName

它工作正常。

那么如何仅将 utils 目录转换为一个包,以便从同级目录中导入其中的任何文件?

注意:我只需要在这个项目上使用包。

注意:我正在尝试获得永久解决方案,因此 sys.path.insert() 似乎不是一个选择。


编辑:标记为正确的答案有效,但我最终得到了不同的解决方案。从框架目录简单运行(我使用的是 Linux):

DIR=$(pwd) && export PYTHONPATH="${PYTHONPATH}:$DIR"

这会将框架目录放在 Python 的 sys.path 变量上。使其成为 Python 查找包和模块的途径。

我猜你只是使用更适合你的情况的那个。

标签: python-3.xmodulepackage

解决方案


相对导入仅适用于每个库路径的根目录,您不能使用相对导入来访问库路径根目录的父级。在从您自己的项目中导入模块的情况下,库的根路径是运行解释器的位置,因此为了导入utils/utilsFile.py,您必须从运行extractionFile.pyframework不是extraction.

但是,如果您确实希望能够从 运行extractionFile.pyextraction一个简单的解决方案是..通过将其附加到sys.path列表来添加到库路径,以便 的父目录extraction将成为库路径之一,这样您就可以直接导入utils.utilsFile

import sys
sys.path.append('..')
from utils.utilsFile import functionName

推荐阅读