小上下文:我正在用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 Utils
。 test_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
,它只会执行这些本地导入。
答案 0 :(得分:2)
python解释器将脚本的目录添加到sys.path
(sort of reference)。此外,它被放在路径的开头,因此首先进行搜索。这就是本地celery.py
覆盖已安装模块的原因。
您可以更改sys.path
并删除本地目录或将其放在后面,但我认为更好的解决方案是不要在全局模块之后命名本地模块。
from . import xyz
语法仅适用于导入包中的子包(docs)