【问题标题】:Python import error solution. (Need a better approach)Python导入错误解决方案。 (需要更好的方法)
【发布时间】:2020-08-17 13:53:27
【问题描述】:

我的Dir结构是这样的

├── server.py
└── Utils
    ├── A.py
    ├── __init__.py
    ├── B.py

在 server.py 中,有一个导入

from Utils.B import SomeClass

在 B.py 内部也有一个导入

from .A import SomeClass

在运行 server.py 时,它运行良好。但是在 Utils 中运行 B.py 时,它会抛出错误:

ModuleNotFoundError: No module named '__main__.A'; '__main__' is not a package

然后删除点然后运行,B.py 工作正常,但 server.py 抛出错误。 有什么解决方案可以同时运行吗?

【问题讨论】:

    标签: python python-3.x module package


    【解决方案1】:

    我会尽量远离相对导入(带有前导 . 的导入)。

    一般来说良好的文件结构如下所示:

    Project
    ├── setup.py
    ├── README.md
    └── project
        ├── __init__.py
        ├── server.py
        └── Utils
            ├── __init__.py
            ├── A.py
            └── B.py
    

    这里的主要内容是:

    • 有一个名为Project 的主文件夹保存所有文件。
    • 直接在其中放置所有元文件,例如setup.pyREADME.md 以及所有爵士乐。我们不在这里放任何代码,因为我们不希望这个文件夹被视为一个包(没有 dunder init 文件)。
    • 我们创建第二个文件夹,名称相同但小写 (project),这是主要的python package,因为我们在这里放置了一个 dunder 初始化文件。这是我们所有导入的基础。
    • 然后,每次导入时,我们都会像这样定义完整路径:from project.Utils.A import SomeClass
    • 如果您希望从包中轻松导入该类,则可以在第一个 dunder 初始化文件中写入 from project.Utils.A import SomeClass,之后您可以在需要时使用 from project import SomeClass

    这个答案也很好很相关:https://stackoverflow.com/a/3419951/3936044

    【讨论】:

    • 我使用了文件结构。现在它显示: Traceback(最近一次调用最后一次):文件“server.py”,第 1 行,在 from demo.utils.b import B ModuleNotFoundError: No module named 'demo'
    • 在您的示例中,您已大写 UtilsB.py,如果不是这样,那么如果您不显示确切的结构和代码,我将无法真正帮助您,您将不得不在那案子
    • 结构相同。我只是将 some_function 更改为 B,将 utils 更改为 Utils。如果这是错误的情况,我会改变它
    猜你喜欢
    • 2011-05-05
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多