Python3中的相对导入 [英] relative import in Python 3

查看:17
本文介绍了Python3中的相对导入的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我的项目结构如下:

myproject
├── calendar.py
├── foo.py
└── __init__.py

在foo.py中,我有

from calendar import isleap

我认为在Python3.x中,如果不使用显式的.calar,上面的代码应该加载内置的日历模块,而不是我自己的日历模块,但显然我本地的calendar.py仍在导入,并且它抛出一个错误,因为mypkg/calendar.py中没有‘isleap’。为什么将我的本地日历模块导入此处?

我必须将calendar.py重命名为cal.py才能完成此工作。

推荐答案

from __future__ import absolute_import是Python3上的默认设置。因此,from calendar import isleap语句导入顶级模块calendar

如果您看到其他结果,则表示您没有使用Python3,或者您正试图从包中以脚本形式运行一个Python模块(myproject目录本身位于sys.path中)。如果是后者,则您的calendar.py将成为顶级模块(由于sys.path中的当前目录在stdlib目录之前))from calendar import isleap从当前目录导入calendar.py"Never add a package directory, or any directory inside a package, directly to the Python path"

要避免这种情况,请不要直接从python包中运行模块,例如,不要这样做:cd myproject; python foo.py。改为:python -mmyproject.foo(或者您可以define what scripts should be run in setup.pycreate a similar script manually: from myproject import foo; foo.main())。

如果要将Python包作为脚本运行,请创建myproject/__main__.py,然后运行python -mmyproject


如果要在Python3中执行相对导入,请显式执行,例如myproject/foo.py

from .calendar import something

或执行绝对导入:

from myproject.calendar import something

这篇关于Python3中的相对导入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆