python中的绝对导入不起作用,相对导入起作用

Posted

技术标签:

【中文标题】python中的绝对导入不起作用,相对导入起作用【英文标题】:Absolute imports in python not working, relative imports work 【发布时间】:2018-01-08 22:22:16 【问题描述】:

我似乎无法让绝对导入在 python 中工作。这是我的文件结构:

a/
  b/
    __init__.py
  __init__.py
  foo.py

foo.py:

# Including or removing the __future__ import has no effect
from __future__ import absolute_import
from a import b  # just `import b` works fine
print "success!"

我反而得到:

ImportError: No module named a

这里到底发生了什么?我觉得我缺少一些基本的东西。虽然这个例子很简单,但我需要绝对导入才能为实际项目工作,因此仅用相对导入替换导入不是一种选择。我正在使用 python 2.7.13

没有列出here帮助的解决方案

提前感谢您的任何见解!

【问题讨论】:

foo.py 是否在 a 目录中?您在图表中将其显示为外部。 我的错,谢谢你的收获 听起来你犯了一个常见的错误,即直接运行包的子模块而不是作为子模块。这里有一个骗子——真的有很多骗子,但我认为至少有一个好人。 你能详细说明一下吗?我仍然对问题所在感到有些困惑。 我不确定,但也许@user2357112 说你应该写下import a.b,因为ba 的子模块 【参考方案1】:

由于未显示,我必须假设您正在运行 python a/foo.py,这会将脚本的目录 ('a') 放在 sys.path 的开头,而实际上您希望当前目录位于开头sys.path.

您应该改为运行 python -m a.foo,这将为您的项目结构正确初始化 sys.path 根。

这是我写的a more in-depth writeup,以其他方式解决同样的问题。

【讨论】:

谢谢!这是我正在寻找的解决方案/解释。该链接也非常有用。

以上是关于python中的绝对导入不起作用,相对导入起作用的主要内容,如果未能解决你的问题,请参考以下文章

更改导入模块的变量似乎不起作用。 [Python]

Python 中的相对导入

在 ~/.bashrc 中使用 PYTHONPATH 导入 Python 模块不起作用

java中的包帮助 - 导入不起作用

cpanel中的Phpmyadmin导入数据库不起作用

我想平滑我的 python matplotlib 图,代码不起作用 [重复]