繁体   English   中英

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

[英]Python - ImportError: attempted relative import with no known parent package

我的项目中的导入有问题。

我的目录结构如下:

base_directory
  - examples
  - src
    - folder_1
      - __init__.py
      - file.py
    - folder_2
      - __init__.py
      - class1.py
      - class2.py
      - class3.py
      - class4.py

file.py我正在尝试: from..folder2.class1 import Class1然后,我收到错误:

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

folder2/__init__.py我做了我在 Python 中制作包的教程中看到的内容:

from class1 import Class1

my_class_1 = Class1()

到目前为止,一切都奏效了。 我应该怎么办? 我使用 Python 3.7.5

谢谢。

在您的示例中, folder_1 和 folder_2 是两个独立且唯一的包。 它们之间没有相对进口。 将它们放在单个外部 package 中以使其工作

base_directory
  - examples
  - src
      - mypackage
        - __init__.py
        - folder_1
          - __init__.py
          - file.py
                print("imported", __file__)
                from ..folder_2.class1 import Class1
                print("file.py found", Class1)
        - folder_2   
          - __init__.py
          - class1.py
                print("imported", __file__)
                class Class1:
                def __init__(self):
                    print("Created Class1 instance")
          - class2.py
          - class3.py 
          - class4.py
      - test.py
            import myproject.folder_1.file

运行 test.py 脚本

~/tmp/base_directory/src$ python test.py
imported /home/td/tmp/base_directory/src/myproject/folder_1/file.py
imported /home/td/tmp/base_directory/src/myproject/folder_2/class1.py
file.py found <class 'myproject.folder_2.class1.Class1'>

但是有一种解决方法,可以使用“-m”选项调用模块。 但他只有在myproject位于 python 路径中时才有效。 它在这里工作,因为当我调用它时我在 myproject 的父级中。

~/tmp/base_directory/src$ python -m myproject.folder_1.file
imported /home/td/tmp/base_directory/src/myproject/folder_1/file.py
imported /home/td/tmp/base_directory/src/myproject/folder_2/class1.py
file.py found <class 'myproject.folder_2.class1.Class1'>

对于那些不想改变他们的文件系统结构来使相对导入工作的人,我创建了一个新的实验库: ultraimport

无论您如何运行代码,它都允许基于文件系统的导入。 超进口将永远有效。

在你的 file.py 然后你会写

import ultraimport
Class1 = ultraimport('__dir__/../folder2/class1.py', 'Class1')

此导入不依赖于您当前的工作目录,它不关心它是模块、包还是脚本。 这是一个 Python 文件,您可以导入它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM