【问题标题】:python relative import module failedpython相对导入模块失败
【发布时间】:2018-07-20 03:59:18
【问题描述】:

我的文件结构如下:

root/
    v1/
    __init__.py
    example_1.py
    script/
        __init__.py
        classification.py
        prediction.py
        example2.py

分类如下所示:

#classification.py    
print(__name__)
from .prediction import predict_func
def func1():
    predict_func()

这对于看起来像这样的 example1.py 很有效

#example1.py
from script.classification import func1
func1()

但是像下面这样从example2.py导入分类会失败

#example2.py
from classification import func1
func1()    

因为在example2.py场景中__name__在分类中只是classification而不是script.classification作为example1.py,因此这里没有父节点,因此导入模块失败。

我知道解决方案之一是将脚本目录添加到 example1.py 和 exaple2.py 中的 sys.path,并在分类中使用 from prediction import predict_func。这在 example1.py 和 example2.py 中都适用,但这是一个好方法吗,还有其他替代方法吗?

【问题讨论】:

标签: python import module package


【解决方案1】:

由于example_1.py 位于root 目录中,这让我认为root 是您项目的源根目录。所以,这个目录必须出现在Python路径中,即:sys.path

而且,root 下的每个目录都应该是一个 Python 包。所以,script 必须有一个__init__.py 文件(通常为空)。

您应该查看有关Modules 的官方Python 教程。

编辑

在您的第二个示例(如下)中,您尝试导入分类,就好像它是一个根包但它不是。

# example2.py
from classification import func1
func1()

要解决这个问题,您需要使用相对导入或完整的包名:

# example2.py
from script.classification import func1
func1()

当然,要运行您的示例,您需要执行以下操作:

python -m script.example2

【讨论】:

  • 我在脚本和 v1 中确实有 __init__.py。我更新了结构。但这仍然不能解决相对路径问题。
  • @I-PINGOU。我编辑了我的答案。你需要澄清吗?如果没有,你可以Vote on it and accept it
  • 感谢您的回答。我刚刚对其进行了测试,如果我从 v1 运行命令,它可以与 python -m script.example2 一起正常工作。但是如果我从 root 运行解释器,它就不起作用。我认为因为 -m 选项将当前工作目录添加到 sys.path 所以 script.classification 在 cwd 为 v1 时有效
猜你喜欢
  • 2017-01-25
  • 1970-01-01
  • 2013-12-03
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
相关资源
最近更新 更多