【问题标题】:Importing between nested packages in Python 3在 Python 3 中的嵌套包之间导入
【发布时间】:2018-03-18 06:34:30
【问题描述】:

运行 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 的目录。我在网上搜索了答案,但无法弄清楚我错过了什么。

我在这里做错了什么?

【问题讨论】:

    标签: python packages python-import


    【解决方案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!")
    

    【讨论】:

    • 谢谢,这似乎是最简单的解决方案。我喜欢 Python,但包和导入有时会很痛苦……
    • 不客气。我同意,我也喜欢 Python。没有刺就没有玫瑰。每种语言都有艰难的一面。另外,不要忘记阅读我上面提供的链接,它对导入非常有帮助。
    【解决方案2】:

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

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

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

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

    因此,您必须将目录C:\Users\your_user\dir_before_test_project\ 添加到PYTHONPATH 环境变量中

    【讨论】:

      猜你喜欢
      • 2018-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 2015-05-30
      • 2014-10-17
      相关资源
      最近更新 更多