另一个导入错误:尝试相对导入,但没有已知的父包



我有以下目录结构:

py_test
├── __init__.py
├── dir1
│   ├── __init__.py
│   └── script1.py
└── dir2
├── __init__.py
└── script2.py

script2我想"import ..script1"。

我在script2尝试过:

  1. 不起作用

    from ..dir1 import script1
    ImportError: attempted relative import with no known parent package`
    
  2. 工程

    import sys, os
    path2add = os.path.normpath(os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir, 'dir1')))
    if (not (path2add in sys.path)) :
    sys.path.append(path2add)
    

如果我想使用选项 1,让它工作的最简单(即文件最少(文件/目录结构是什么?我知道这一点,但我想知道是否可以避免创建该目录结构,并且仍然使用 Type-1import.

我目前正在使用此解决方法,它使用类型 2import.

相关:

如何导入上面目录中的 Python 类?

从上一级目录(包(导入模块

从 Python 解释器运行时获得"导入错误:尝试相对导入,没有已知的父包">

使用 importlib 动态导入包含相对导入的模块

如何在不同的 python 文件中导入变量

如注释中所述,如果script2.py是您的入口点,则尝试导入目录的模块将不起作用。

如此链接所述,您包括:

如果模块的__name__不包含任何包信息(例如,它设置为__main__(,则相对导入将解析为模块是顶级模块,而不管模块在文件系统上的实际位置如何。

模块的__name__设置为__main__,如果它是入口点,还是您传递给解释器的入口点,例如python script2.py.

任何以这种方式运行的 python 模块都不再具有从更高目录导入文件所需的信息。

因此,您有两种选择:

选项 1:继续使用变通办法sys.path.append

这将按照您想要的方式工作,但它相当麻烦。

选项 2:将入口点设置为顶层

假设包有多个需要运行的脚本,则可以创建一个新文件,该文件同时导入script1script2,然后根据命令行参数调用所需的功能。然后,您将能够保持当前的目录结构,并使您的相对导入正常工作,而无需摆弄sys.path

相关内容

最新更新