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。
另外,请注意以灵活的方式指定文件路径,不要硬编码。