在 Python 3 中的嵌套包之间导入

Importing between nested packages in Python 3

运行 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_projectparent 目录。我试过在我的 PATH 中包含 sub_project2 的目录。我在网上搜索了答案,但无法找出我遗漏的内容。

我做错了什么?

您需要将"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!")

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

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

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

  3. 依赖于安装的默认值。

因此,您必须将目录 C:\Users\your_user\dir_before_test_project\

添加到 PYTHONPATH 环境变量