Relative import doesn't work : ImportError: attempted relative import with no known parent package

Relative import doesn't work : ImportError: attempted relative import with no known parent package

这是文件:

parent_directory:

parent_directory/ecommerce:

parent_directory/ecommerce/付款:

我想做的是在 products.py 中使用相对导入来导入 database.py。我知道我可以写 import database 但我想学习相对导入。我还尝试从顶级目录 parent_directory 导入 main.py,但这也不起作用,所以我想我会尝试做最简单的相对导入,那就是,从同一包中导入文件。

这是 parent_directory/ecommerce 中 products.py 的代码:

from .database import Database

class Product:
    pass

这是 parent_directory/ecommerce 中 database.py 文件中的代码:

if __name__ == "__main__":
    import products

    x = products.Product()

class Database:
    pass

print("file : {0:<35} || name : {1:<20} || package : {2:<20}".format(
    str(__file__).split("\")[-1],
    str(__name__),
    str(__package__),
))

我尝试了几种方法,例如:

这是我的 init.py 文件,来自 parent_directory/ecommerce:

__all__ = ["database", "products"]
__package__ = "ecommerce"

无论我做什么,我总是得到这个错误:ImportError: attempted relative import with no known parent package。我知道以前有人问过这个问题。我已经尝试了很多东西,但没有任何效果。你知道如何解决这个问题吗?

我找到了一种从父目录导入文件的方法,因为使用绝对导入很容易从子包中导入它们。

# inside parent_directory/ecommerce/products.py trying to import parent_directory/main.py
import sys
import os

current_file = os.path.realpath(__file__)
current_dir_ecommerce = os.path.dirname(current_file)
parent_dir_parent_directory = os.path.dirname(current_dir_ecommerce)
sys.path.insert(0, parent_dir_parent_directory)

import main # works

我刚刚将父目录添加到 sys.path。

我找到了解决问题的方法。 我必须在包外并使用 -m 而不是使用 / 发送路径,我必须使用 .而是这样:

python -m parent_directory.ecommerce.products

这将解决问题,但我必须在顶级包外执行此行(在我的例子中,顶级包是parent_directory)。

# Inside products.py
from .database import Database # works
from ..main import SomeRandomClass # works

class Product:
    pass