【问题标题】:Yet another ImportError: attempted relative import with no known parent package [duplicate]另一个 ImportError:尝试在没有已知父包的情况下进行相对导入 [重复]
【发布时间】:2020-04-16 18:38:36
【问题描述】:

我的目录结构如下:

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,使其工作的最简单(即文件最少)的文件/目录结构是什么? 我知道this,但我想知道是否可以避免创建该目录结构,并且仍然使用type-1 import

我目前正在使用this workaround,它使用type-2 import

相关:

How to import a Python class that is in a directory above?

Import a module from a directory (package) one level up

Getting "ImportError: attempted relative import with no known parent package" when running from Python Interpreter

Using importlib to dynamically import module(s) containing relative imports

How to import variables in a different python file

【问题讨论】:

  • 你是如何运行代码的?来自哪个工作目录?
  • @mkrieger1 - 来自 dir2,在 Jupyter 笔记本中。
  • 您不能在主脚本(我假设为“script2.py”)的位置上方相对导入。在“py_test”中放置一个主脚本,然后可以导入并运行“script2.py”。
  • 当通过任何导入您的py_test 包的模块运行时,它将运行正常。
  • 导入包是这样组织的,作为要使用的包导入。因此,从内部执行多个入口点是没有意义的,而且通常它们永远不会(一起)工作。

标签: python import package python-import


【解决方案1】:

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

this link you included中所述:

如果模块的__name__ 不包含任何包信息(例如,它被设置为__main__),那么无论模块实际在哪里,相对导入都会像模块一样被解析为顶级模块位于文件系统上。

模块的__name__ 设置为__main__,如果它是入口点,或者你用python script2.py 之类的东西传递给解释器的那个。

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

因此你有两个选择:

选项 1:继续使用sys.path.append 的解决方法

这将按照您的意愿工作,但它相当麻烦。

选项 2:在顶层设置入口点

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 2020-10-13
    • 2020-06-20
    • 2021-10-31
    • 2021-10-20
    • 2020-09-22
    • 2021-12-20
    • 2021-12-19
    相关资源
    最近更新 更多