2017-10-06 27 views
1

运行Python 3.6.1,并试图从我的项目中的另一个包中导入文件(world.py)。在Python 3中的嵌套包之间导入

我的目录结构:

+-- 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目录。我试过在我的路径中有test_project父目录目录。我试过在我的PATH中有sub_project2的目录。我在网上搜索了答案,无法计算出我错过的内容。

我在这里做错了什么?

回答

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!") 
+0

感谢的是,这似乎是最简单的解决方案。我喜欢Python,但是包和导入可能有时是一种绝对的痛苦...... – Megdatronica

+0

不客气。我同意,我也爱Python。没有刺就没有玫瑰。每种语言都有强硬的一面。另外,不要忘记阅读我上面给出的链接,这对导入非常有帮助。 – Alperen

1

的问题是,你有你的项目添加到Python路径。原因是python首先在这些位置搜索:

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

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

  3. 安装依赖的默认值。

所以,你必须添加到PYTHONPATH环境变量中的目录C:\Users\your_user\dir_before_test_project\