Python导入-引用顶级模块,而不是;“在级别中”;模块
Python v2.7 目录结构: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.
- 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。我直到现在才知道,但现在我知道了,多亏了你。