Python意外导入位置

时间:2016-01-26 16:17:22

标签: python python-3.x import

小上下文:我正在用Python编写一个使用Celery的项目。我使用了一个实用函数的通用框架(我自己编写),它将pip安装为本地模块,实用程序库也用于其他项目。

我有一个这样的项目目录:

project/
  __init__.py
  celery.py
  test_runner.py
  some_more_files_that_dont_matter_for_this_example.py

我作为python模块安装的实用程序项目,如下所示:

__init__.py
utils/
  __init__.py
  utils.py
setup.py

现在,我有一些代码来初始化celery.py中的芹菜,其中包括from utils.utils import Utilstest_runner.py看起来像这样:

from utils.utils import Utils
if __name__ == '__main__':
    print 1+1

我的utils.py中包含以下内容:from celery import Celery,它应该引用我使用pip install celery安装的芹菜模块。

当我执行python test_runner.py时出现的问题是,它尝试导入utils.py,然后显然导入project/celery.py(而不是我安装的芹菜模块)并且循环依赖发生(因为project/celery.py导入utils/utils.py)。

有人可以向我解释如何确保from celery import Celery中的utils/utils.py仅导入实际安装的芹菜模块,更重要的是:为什么导入会像这样发生?我正在运行Python 3.5,我认为如果我使用from . import x,它只会执行这些本地导入。

1 个答案:

答案 0 :(得分:2)

python解释器将脚本的目录添加到sys.pathsort of reference)。此外,它被放在路径的开头,因此首先进行搜索。这就是本地celery.py覆盖已安装模块的原因。

您可以更改sys.path并删除本地目录或将其放在后面,但我认为更好的解决方案是不要在全局模块之后命名本地模块。

from . import xyz语法仅适用于导入包中的子包(docs