在Python 3中嵌套包之间导入

时间:2017-10-06 12:40:15

标签: python packages python-import

运行Python 3.6.1,我试图从我项目中的另一个包中导入一个文件(world.py)。

我的目录结构:

+-- test_project
|   +-- sub_project1
|   |   +-- __init__.py
|   |   +-- hello.py
|   +-- sub_project2
|   |   +-- __init__.py
|   |   +-- world.py

hello.py

def say_hello():
    return("Hello ")

world.py

from test_project.sub_project1.hello import say_hello

print(say_hello() + "world!")

当我进入sub_project2目录并运行world.py时,我会继续这样做:

ModuleNotFoundError: No module named 'test_project'

我尝试将导入语句重写为from sub_project1.hello import say_hello。我也尝试在PATH环境变量中使用test_project目录。我已尝试在PATH中使用test_project目录。我已尝试在PATH中使用sub_project2的目录。我在网上搜索了答案,无法解决我所缺少的问题。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

您需要将“hello.py”的路径添加到sys.path

import sys
sys.path.append('../sub_project1')

from hello import say_hello

print(say_hello() + "world!")

输出:

Hello world!

来源是here。这个讨论非常有用。

编辑:因为“sub_project1”有__init__.py,您可以使用:

import sys
sys.path.append('..') #Adds upper directory sys.path

from sub_project1.hello import say_hello

print(say_hello() + "world!")

答案 1 :(得分:1)

问题是您必须将项目添加到python路径。原因是python首先在这些位置搜索:

  1. 包含输入脚本(或当前目录)的目录。

  2. PYTHONPATH(目录名列表,语法与shell变量PATH相同)。

  3. 依赖于安装的默认值。
  4. 因此,您必须将PYTHONPATH环境变量添加到目录C:\Users\your_user\dir_before_test_project\