虽然Python模块的包已导入,但访问该模块失败

2024-10-03 00:31:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我的Django项目的目录层次结构如下所示:

+ pybsd
|---+ devices
    |---+ templates
    |---+ views
        |---+ interaction
            |---- __init__.py
            |---- geraete.py
            |---- geraetemodelle.py
            |---- geraetegruppen.py
        |---- __init__.py
        |---- ajax.py
        |---- html.py
        |---- misc.py
    |---- __init__.py
    |---- urls.py
|---- __init__.py
|---- urls.py

(请原谅德国名字。我不希望在这里替换它们,因为在尝试您希望建议的解决方案并回答您的问题时,这会增加另一个可能的错误源。)

http://URL/devices/.*的每个请求都被调度到网址.py文件寄存/设备:

^{pr2}$

除了那些引用交互包的URL定义外,所有URL定义都有效。我经常遇到以下错误:

File "/home/simon/projekte/pybsd/../pybsd/devices/urls.py", line 33, in `<module>`
  (r'^interaction/geraete/info/(?P<geraet>\d+)$', interaction.geraete.info),
AttributeError: 'module' object has no attribute 'geraete'

我仔细检查了__init__.py文件是否包含任何内容。在

也许你已经找到了(Python或Django相关的?)我犯了一个明显看不见的错误。如果没有,请继续读。无论如何,感谢你阅读这篇长文章!


隔离问题

第一次测试

如果我以字符串的形式提供视图函数,则可以:

(r'^interaction/geraete/info/(?P<geraet>\d+)$', 'devices.views.interaction.geraete.info'),
(r'^interaction/geraete/delete/(?P<geraet>\d+)?$', 'devices.views.interaction.geraete.delete'),
(r'^interaction/geraetemodelle/delete/(?P<geraetemodell>\d+)?$', 'devices.views.interaction.geraetemodelle.delete'),
(r'^interaction/geraetegruppen/delete/(?P<geraetegruppe>\d+)?$', 'devices.views.interaction.geraetegruppen.delete'),

。。。或者在导入中添加另一行:

from views.interaction import geraete, geraetemodelle, geraetegruppen

但是,使用from views.interaction import *也不起作用,会导致相同的错误消息。在


第二次测试

我创建了一个文件测试.py输入/设备:

from views import interaction
print dir(interaction)

输出:

simon@bsd-simon:~/projekte/pybsd/devices$ python test.py
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']

同样,我在交互包中创建的模块没有任何迹象(杰拉特.py, geraetemodelle.py, 杰拉特格鲁本.py). 在

不像在网址.py,正在尝试from view.interaction import geraete, geraetegruppen, geraetemodelle测试.py这次结果是ImportError: No module named view.interaction。在


第三次测试

我启动了Django shell:

$ python manage.py shell
>>> import devices.views.interaction.geraete
>>> dir(devices.views.interaction.geraete)
['Abteilung', 'Auftrag', 'Auftragsvorlage', 'Geraet', 'Geraetegruppe', 'Geraetemodell', 'HttpResponse', 'HttpResponseBadRequest', 'HttpResponseRedirect', 'Raum', 'Standort', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'delete', 'info', 'models', 'move', 'render_to_response']
>>> 

$ python manage.py shell
>>> from devices.views.interaction import geraete
>>> dir(geraete)
['Abteilung', 'Auftrag', 'Auftragsvorlage', 'Geraet', 'Geraetegruppe', 'Geraetemodell', 'HttpResponse', 'HttpResponseBadRequest', 'HttpResponseRedirect', 'Raum', 'Standort', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'delete', 'info', 'models', 'move', 'render_to_response']
>>> 

$ python manage.py shell
>>> import devices.views.interaction
>>> devices.views.interaction.geraete
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'module' object has no attribute 'geraete'
>>> dir(devices.views.interaction)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']

Tags: frompyimportinfoinit错误deleteviews
3条回答

当模块位于包中并且您导入包时,Python不会自动导入包中的所有模块。程序中的某些内容需要导入要使用的模块。它可以是您的urls模块:

import views.interaction.gaerete

或者,如果您希望interaction.garaete在导入interaction时始终可用,则可以是interaction/__init__.py

^{pr2}$

如果子模块没有导入到__init__.py文件中,则应显式导入这些子模块:

import interaction.geraete

当你说

import devices.views.interaction

后来呢

^{pr2}$

Python在交互包的__init__.py模块中寻找geraete。在

如果您希望看到这一点,您可以在__init__.py模块中显式地包含import geraete。在

相关问题 更多 >