首页 > 解决方案 > 相对导入抛出 ValueError

问题描述

我有以下项目结构(使用python 3.6):

Project
|  scripts
|  |  module.py
|  tests
|  |  test.py

module.py包含一个名为Class1.

test.py有以下代码:

from .. scripts.module.py import Class1

但是,当我运行 test.py 时,出现以下错误:

ValueError: attempted relative import beyond top-level package

我该如何解决?为什么相对导入不起作用?

这篇文章可能会被标记为重复,但我要么无法理解我目前看到的帖子,要么这些帖子不能反映我的情况。

编辑:我查看了一些 python Github 存储库,它们在他们的测试代码中,他们都做了类似import scripts.module. 这是如何运作的??我是否需要额外的文件才能像这样连接我的项目?

这是我查看的 Github 存储库。我所说的位于测试文件夹中:https ://github.com/AtsushiSakai/PythonRobotics和https://github.com/nbedos/termtosvg

标签: pythonpython-3.ximport

解决方案


在这里回答我自己的问题:

显然,在运行 python 脚本时,如果不进行修改,就无法导入脚本所在目录之上的任何内容sys.pathSource,请参见案例 4)。正在运行的脚本所在的包被视为顶级模块。如果那是正在运行的脚本,你不能超过这个。

当然,也有解决方法:

解决方案:

  1. 修改sys.path. 这是我发现的最好的方法(鉴于我上面的文件目录结构,您可能有不同数量的句点):

    import sys.path
    sys.path.append('.')
    
    from scripts.module import Class1
    
  2. 从上面的脚本运行模块。例如,我会将文件目录更改为:

    Project
    |  main.py
    |  scripts
    |  |  module.py
    |  tests
    |  |  test.py
    

    main.py中,我会输入:

    import tests.test.py
    

    我可以在 中包含以下内容test.py,它仍然可以解决:

    from scripts.module import Class1
    
  3. 与 #2有相同的内容,test.py但从命令提示符运行它:

    cd ...\Project
    python
    >>> import tests.test
    >>> # do what you need
    

推荐阅读