导入我的包时出现 ModuleNotFoundError,但单独 运行 时不会

ModuleNotFoundError when importing my package, but not when running it alone

我正在尝试创建一个 python 包,但我在导入时遇到了问题。我的代码在 运行 时按预期工作,但是当我使用诗歌安装包并将其导入另一个脚本时,我有一个 ModuleNotFoundError。

我的文件结构如下:

git_repo
|  myapp
|  |--__init__.py
|  |--mainscript.py
|  |--library
|  |  |--__init__.py
|  |  |--module.py

我的文件 mainscript.py 导入 module.py 因为有一些实用功能: from library import module

当我执行主脚本时,没问题。但是,当使用 poetry install 安装 myapp 并尝试将其导入 python shell 时:

> python

>>> import myapp.mainscript

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "D:\path\to\mainscript.py", line 5, in <module>
    from library import module
ModuleNotFoundError: No module named 'library'

是否有我不了解导入的机制?我必须在 __init__.py 文件中写一些东西吗?

在此先感谢您的帮助

there are some utility functions: from library import module

你想要:

from .library import module

https://docs.python.org/3/reference/import.html#package-relative-imports

https://docs.python.org/3/reference/simple_stmts.html#import

https://realpython.com/python-import/#absolute-and-relative-imports

好的,所以我找到了解决我自己问题的方法。

正如J_H建议的那样,我尝试了相对导入。这在安装我的包并使用它时有效。但是我在运行我的主脚本时遇到了ImportError: attempted relative import with no known parent package

解决方案是使用绝对导入。现在这在安装包和 运行 主脚本时都有效。

# mainscript.py
from myapp.library import module

我还在 __init__.py 文件中添加了一些导入,以便在安装时轻松使用我的包:

# myapp/__init__.py
from . import library
from .mainscript import mainClass

这让我可以 a = myapp.mainClass() 而不是 a = myapp.mainscript.mainClass()