无法在 python 中导入并行模块

unable to import parallel modules in python

我做了一些研究并尝试应用它但失败了。 我有一个项目结构如此使用 python 3.10:

└── project
    ├── main
    │   └── main.py
    └── pkg1
        └── module.py

module.py 和 main.py 没什么特别的:

#module1.py
def hello():
    print('hello')

然而在 main.py 中所有导入都失败了(显然我只调用了 3 个中的一个)。

#main.py
from pkg1.module import hello
from .pkg1.module import hello
from ..pkg1.module import hello

hello()

对于任何尝试过的导入,我得到:

ImportError: attempted relative import with no known parent package

如何导入模块? 是的,由于限制,我必须保持 file/folder 结构不变。

我建议您创建一个父包,然后将您的入口点 main.py 放在该包的根目录下。

project ( your actual project root)
    |_project/ (your package root)
        |_ __init__.py (empty)
        |_ __main__.py (contents: from pkg1.module import hello; hello())
        |_ pkg1/
            |_ __init__.py (empty)
            |_ module.py (content: def hello: ...)

编辑:

从那个结构来看,如果你有一个包必须使用兄弟包的场景,你就解决了父包问题

例如,从 pkg1 导入 pkg2。如果您从顶级模块 运行 没问题。

project
    |_project/
        |_ __init__.py
        |_ __main__.py (contents: from pkg1.module import hello; hello())
        |_ pkg1/
            |_ __init__.py
            |_ module.py (content:from pkg2.module import hi; def hello: hi())
        |_ pkg2/
            |_ __init__.py
            |_ module.py (content: def hi: ...)

您可以通过 project 的父目录中的 -m switch 调用 main 模块,然后使用 from ..pkg1.module import hello。这样 .. 可以解析,因为有一个父包(即 project):

python -m project.main.main

另一种方法是扩展 sys.path 并将 project 目录添加到 main.py 中的搜索路径:

import sys
sys.path.append('/path/to/project')

from pgk1.module import hello

然后您可以使用 python main.py.

main 目录中调用主脚本

如果您在 project 中通过 python main/main.py 调用它,那么您甚至不需要修改路径,因为当前工作目录将自动添加到搜索路径中。