Python导入-引用顶级模块,而不是;“在级别中”;模块

Python导入-引用顶级模块,而不是;“在级别中”;模块,python,django,Python,Django,Python v2.7 目录结构: - project - manage.py - utils - __init__.py - somescript.py - apps - __init__.py - someapp - views.py - utils.py // imports from utils import somescript // rest of the stuff project.apps.someapp.

Python v2.7

目录结构

- project
  - manage.py
  - utils
    - __init__.py
    - somescript.py
  - apps
    - __init__.py
    - someapp
      - views.py
      - utils.py
// imports
from utils import somescript

// rest of the stuff
project.apps.someapp.views

- project
  - manage.py
  - utils
    - __init__.py
    - somescript.py
  - apps
    - __init__.py
    - someapp
      - views.py
      - utils.py
// imports
from utils import somescript

// rest of the stuff
引发导入错误:无法导入名称somescript

尝试了点相对导入:

// imports

from ...utils import somescript

// rest of the stuff
这将引发
ValueError:尝试在顶级包之外进行相对导入

这是一个Django项目。它通过
manage.py
运行

命令
/manage.py runserver 0:41000

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

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

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

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

project.apps.someapp.views

import imp
somescript = imp.load_source('utils.somescript', 'path/to/utils/somescript.py')
现在,您可以在
视图.py
中使用
somescript
。这不是最好的解决方案,但它可能会帮助您缩小差距,直到您准备将代码库升级到Python3为止


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

我有点惊讶,像Daniel Roseman这样的人建议您重命名其中一个模块,因为这个问题早已通过
\uuuu future\uuu
库在py2中提供绝对导入支持解决了

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

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

from __future__ import absolute_import
import utils # => project.utils
from . import utils as local_utils # => apps.someapp.utils
注意:请注意,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu未来
指令仅影响当前模块,其他模块将不受影响


NB2:你可能还想看看
\uuuuu future\uuuuu.unicode\u literals
——它让django项目的生活变得更加轻松,而django项目大多都希望使用unicode。

我会将
utils
放入
应用程序中。然后您可以执行:
from..utils import somescript
。使用两个以上的点
进行相对导入是不可取的。@cezar我无法将任何模块从这里移到那里。我有一个简单的解决方案,可以将
apps.someapp.utils
重命名为
apps.someapp.someutils
。对不起,是的,我没有注意到应用中的额外utils有问题。正如你所说的,解决办法是将其重命名。或者,最好升级到Python3,删除隐式相对导入;老实说,你无论如何都应该升级。@DanielRoseman为什么要重命名任何东西?Python2.7支持绝对导入(使用
\uuuuuuuuuuuuuuuuuuu
lib)@brunodesshuilliers您能给出一个示例/源代码来解释它是如何工作的吗?@brunodesshuilliers
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我直到现在才知道,但现在我知道了,多亏了你。