Python无法导入我的模块

99条生命

我正在研究Django项目,并尝试为我在其中创建的应用设置URLConf。(您真的不需要了解Django就能了解我的问题)

这是我项目的相关部分

 /PROJECT
    __init__.py
    settings.py
    urls.py
/home
    __init__.py
    views.py
/user
    __init__.py
    views.py

我试图进口home来自PROJECT/urls.py

PROJECT/urls.py (relevant parts)

from django.conf.urls import url, include
from django.contrib import admin
import user
import home  # <---

urlpatterns = [
    url(r'^$', home.views.index, name='index'),  # <---
    url(r'^register/$', user.views.register, name='register'),
    url(r'^login/$', user.views.login, name='login'),
    url(r'^logout/$', user.views.logout, name='logout'),
]

出于某种原因,导入user 确实起作用,而导入home(及其子模块)不起作用

当我运行Django的内置Web服务器时,出现以下错误:

AttributeError: module 'home' has no attribute 'views'

在导入及其子模块时收到此错误user

我要指出的是,当我运行urls.py在一个普通的Python壳它有两个导入错误回来homeuser,虽然只是home错误,当我运行Django的网络服务器。user我的代码部分已经运行良好,从一开始,我假设是错误在一个正常的外壳,因为它是不应该自己运行。

同样,出于某种原因,尽管它们之间没有明显的区别,但我无法user正确地导入,而正确地home却不能导入

这是在Python 3.5.1和Django 1.9中

Koniiiik

用这个:

import home.views

当您使用Python导入软件包时,它不会递归地导入其中包含的所有子软件包或模块。

import user起作用的原因并不明显,但这可能是因为您正在中导入视图user/__init__.py除非如此,否则另一个模块也有可能user.viewsurl调用之前被导入之前导入这使得Python在事后将views模块插入到user的名称空间中

考虑以下示例:

/tmp/importtest $  mkdir mod_a mod_b
/tmp/importtest $  touch mod_{a,b}/__init__.py
/tmp/importtest $  echo 'A=1' > mod_a/a.py
/tmp/importtest $  echo 'B=2' > mod_b/b.py
/tmp/importtest $  echo 'import mod_b.b' > mod_c.py
/tmp/importtest $  python
Python 3.4.3 (default, Jan  4 2016, 22:02:53) 
[GCC 4.9.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import mod_a, mod_b
>>> mod_a.a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'a'
>>> mod_b.b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'b'
>>> import mod_c
>>> mod_b.b
<module 'mod_b.b' from '/tmp/importtest/mod_b/b.py'>
>>> mod_a.a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'a'
>>> 

如您所见,在导入之前mod_c,内部没有任何内容mod_b,但是一旦mod_c导入便进行了更改,因为它具有将b对象插入的名称空间的副作用mod_b

这使它更清晰了吗?

总之,如果您要访问user.viewshome.views,请始终导入user.viewshome.views而不是仅导入顶层程序包,并希望其他事情恰好会产生正确的效果。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章