无法在 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
调用它,那么您甚至不需要修改路径,因为当前工作目录将自动添加到搜索路径中。
我做了一些研究并尝试应用它但失败了。 我有一个项目结构如此使用 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
调用它,那么您甚至不需要修改路径,因为当前工作目录将自动添加到搜索路径中。