Python子模块导入

时间:2018-04-10 11:23:16

标签: python importerror

我尝试阅读其他类似的问题,但答案对我不起作用,例如Python submodule imports using __init__.pymodule 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中'导入lib'就没有错误。我该怎么解决这个问题?

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

2 个答案:

答案 0 :(得分:3)

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

或  How to import a module given the full path?

答案 1 :(得分:0)

使用from ...lib import talk。由于import lib.talk字典中的__init__.py,因为lib是一个包,因此lib无法正常工作。 你也可以使用path追加方式,但你需要得到这样的东西:

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

这样,无论您的Python代码存储在何处,都会动态地将路径追加到库中。