Python - ImportError: 尝试相对导入但没有已知的父级包。

5

我在我的项目中遇到了导入问题。

我的目录结构如下:

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: 尝试相对导入没有已知的父级包

folder2/__init__.py中,我按照Python中创建包的教程进行了操作。
from class1 import Class1

my_class_1 = Class1()

到目前为止,任何东西都没有起作用,我该怎么办?我使用的是Python 3.7.5

谢谢。


尝试一下这个:from .class1 import Class1 - Abhishek Chatterjee
1
奇怪的是,尽管不应该这样,但我似乎能够在没有任何错误的情况下使其正常工作,而且答案是正确的。 - Daneolog
你提出的方法 @AbhishekChatterjee 是不可行的,看起来唯一让这个工作的方式是把所有文件放在 base_directory 中。 - Francisco
这个回答解决了你的问题吗?尝试使用未知父包进行相对导入 - theX
2个回答

4
在您的示例中,folder_1和folder_2是两个独立且唯一的包。它们之间没有相对导入。将它们放在一个外部包中以使其工作。
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'>

是的,这是正确的。需要在两个子包之上的“src”下创建一个文件,以调用file.py中的主函数或者其他包含程序启动和运行方式的主函数的文件。 - Eno Gerguri
你是将 file.py 作为脚本运行还是作为模块导入?脚本不在包中,因此相对导入无法工作。我会更新示例并添加一些代码来演示。 - tdelaney
@Francisco,也许https://dev59.com/ILzpa4cB1Zd3GeqPFipp可以解决你的问题? - theX

0

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

它允许基于文件系统的导入,无论你如何运行代码。 ultraimports 总是有效的。

在你的 file.py 中,你可以这样写:

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

这个导入与您当前的工作目录无关,它也不在乎它是模块、包还是脚本。它是一个Python文件,您可以导入它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接