Python 导入 - 引用顶级模块而不是"In-Level"模块



Python v2.7

目录结构

- project
- manage.py
- utils
- __init__.py
- somescript.py
- apps
- __init__.py
- someapp
- views.py
- utils.py

project.apps.someapp.views

// imports
from utils import somescript
// rest of the stuff

提高ImportError: cannot import name somescript

已尝试虚线相对导入:

// imports
from ...utils import somescript
// rest of the stuff

这引起了ValueError: Attempted relative import beyond toplevel package.

这是一个 Django 项目。它贯穿manage.py.
命令./manage.py runserver 0:41000

我有点惊讶像 Daniel Roseman 这样的人建议您重命名其中一个模块,因为这个问题早已通过__future__lib 在 py2 中提供支持。

您所需要的只是将其添加到模块的顶部(在任何其他语句之前(:

from __future__ import absolute_import

从那里开始,所有非显式相对导入都将被视为绝对导入(即在py3中(,因此在apps.someapp.views中,您可以执行以下操作:

from __future__ import absolute_import
import utils # => project.utils
from . import utils as local_utils # => apps.someapp.utils

注意:请注意,__future__指令仅影响当前模块,您的其他模块将不受影响。

NB2:你可能也想看看__future__.unicode_literals- 它使django项目的生活变得更加轻松,这些项目大多期望Unicode无处不在。

正如@Daniel Roseman 建议你应该升级到 Python 3。

然而,这并不总是可能的,或者至少现在是不可能的。

有一个Python内置模块imp。您可以使用它手动导入所需的文件。

下面是它如何工作的示例:

project.apps.someapp.views

import imp
somescript = imp.load_source('utils.somescript', 'path/to/utils/somescript.py')

现在,您可以在views.py中使用somescript。这不是最好的解决方案,但它可能会帮助你弥合差距,直到你准备好将代码库升级到Python 3。

另外,请注意以灵活的方式指定文件路径,不要硬编码。

相关内容

最新更新