Python 子模块导入

Python submodule imports

我尝试阅读其他类似的问题,但答案对我不起作用,例如 Python submodule imports using __init__.py and module has no attribute

我的文件夹结构如下:

python_scripts
├── lib
│   ├── __init__.py      # import lib.talk
│   └── talk.py          # def sayhello(x): print(x)
│   
├── src
│   ├── __init__.py      # import lib.talk
│   └── data
│       ├── __init__.py  # import lib.talk
│       └── main.py      # from lib.talk import sayhello
│                          sayhello('hi')
│
└── __init__.py          # import lib.talk

这会引发错误:

Traceback (most recent call last):
  File "main.py", line 1, in <module>
    from lib.talk import sayhello
ModuleNotFoundError: No module named 'lib.talk'

奇怪的是如果我在main.py中简单地'import lib'就没有错误。我该如何解决?

我正在使用 Windows,我非常希望避免使用 sys.path 方法,因为我们不想对路径进行硬编码(这可能会在未来被其他团队使用).

在您的 main.py 文件中,在顶部添加以下内容。

import sys
path = r'{path_to_python_scripts}'

if path not in sys.path:
    sys.path.append(path)

# Now import
import lib

import sys, os
path = os.path.abspath('../..')

if path not in sys.path:
    sys.path.append(path)

# Now import
import lib

如何在给定完整路径的情况下导入模块?

使用from ...lib import talk。你的 import lib.talk 不起作用,因为 lib 是一个包,因为 __init__.pylib 字典中。 您也可以使用 path 附加方式,但您需要这样获取它:

import os, sys
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', 'libs')))

这样,无论您的 Python 代码存储在哪里,您都将始终动态地附加到库的路径。