尝试从父文件夹中将 类 作为包导入
Trying to import classes from parent folder as a package
因此,我正在尝试更多地了解 __init__.py
文件的工作原理。据推测,它可以让您将字典作为一个包导入。我使用 VS 代码。我的 test1.py
运行 符合预期,但 test2.py
文件没有。它给了我错误:ModuleNotFoundError: No module named 'subdir'
。我 运行 来自 test1.py
和 test2.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
环境变量。
因此,我正在尝试更多地了解 __init__.py
文件的工作原理。据推测,它可以让您将字典作为一个包导入。我使用 VS 代码。我的 test1.py
运行 符合预期,但 test2.py
文件没有。它给了我错误:ModuleNotFoundError: No module named 'subdir'
。我 运行 来自 test1.py
和 test2.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
环境变量。