尝试从父文件夹中将 类 作为包导入

Trying to import classes from parent folder as a package

因此,我正在尝试更多地了解 __init__.py 文件的工作原理。据推测,它可以让您将字典作为一个包导入。我使用 VS 代码。我的 test1.py 运行 符合预期,但 test2.py 文件没有。它给了我错误:ModuleNotFoundError: No module named 'subdir'。我 运行 来自 test1.pytest2.py 的脚本。

我已经查找了很多资源,但我还没有找到它。在 test2.py 中,我尝试从 class1.py 导入 Apple class 并从 class2.py 导入 Banana class (两者都是包裹)。 test2.py 正在尝试从父目录导入,这可能是导致问题的原因,但我怎样才能让它工作?

目录结构

init_file_testing/
                   test1.py
                   subdir/
                          __init__.py
                          class1.py
                          class2.py
                          subdir2/
                                  test2.py

test1.py

from subdir import Apple
from subdir import Banana

a = Apple("red")
print(a)

b = Banana("yellow")
print(b)

__init__.py

from subdir.test_class1 import Apple
from subdir.test_class2 import Banana

class1.py

class Apple:
    def __init__(self, color):
        self.color = color
    
    def __str__(self):
        return f"The color of the apple is {self.color}"

class2.py

class Banana:
    def __init__(self, color):
        self.color = color
    
    def __str__(self):
        return f"The color of the banana is {self.color}"

test2.py

import sys
sys.path.append("..")

from subdir import Apple
from subdir import Banana

a = Apple("red")
print(a)

b = Banana("yellow")
print(b)

如果你 运行 python test1.py 并且它有效,这意味着(除非你使用其他技术来设置 sys.path)你在 init_file_testing 文件夹中,并且该文件夹位于搜索 Python 模块的路径中。如果你想 from subdir import 一些东西,那么你需要在你的路径上那个文件夹 - 因为这是包含 subdir 包的文件夹。

如果您 运行 python test2.py 并且 找到了文件 ,这意味着(类似的逻辑)您在 subdir2 中。使用 sys.path.append("..") 修改路径没有 帮助,因为这会将 subdir 文件夹放在路径上,但您需要 init_file_testing 文件夹。相对来说,就是sys.path.append("../..").


但是,如果您愿意使用相对路径作为 hack 的一部分来完成这项工作,那么 为什么不 use relative imports 而是 ?这就是您打算在包中工作的方式。

看起来像:

test1.py

from .subdir import Apple, Banana

__init__.py

from .class1 import Apple
from .class2 import Banana

test2.py

from ..subdir import Apple, Banana

那么,无论从哪个模块开始,只要确保包根目录(init_file_testing)在模块搜索路径上即可;并且您可以从根文件夹或 外部 包文件夹开始(您 无论如何都应该这样做 )。确保设置路径的一种简单方法是 在虚拟环境中安装 您的包(无论如何,这是推荐的开发方法)。您也可以使用 PYTHONPATH 环境变量。