尽管导入了Python模块的包,但访问该模块失败

尽管导入了Python模块的包,但访问该模块失败,python,import,package,Python,Import,Package,我的Django项目的目录层次结构如下所示: + pybsd |---+ devices |---+ templates |---+ views |---+ interaction |---- __init__.py |---- geraete.py |---- geraetemodelle.py |---- geraetegruppen.py |---

我的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
(请原谅德语名称。我不希望在这里替换它们,因为在尝试您希望建议的解决方案和回答您的问题时,这会增加另一个可能的错误源。)

发送到.*的每个请求都会发送到/devices中的url.py文件:

# ...
from views import html, ajax, misc, interaction

urlpatterns = patterns('', 
    # ...
    (r'^ajax/update/(?P<table>[a-z_]+)$', ajax.update),
    (r'^ajax/delete/(?P<table>[a-z_]+)$', ajax.delete),
    (r'^ajax/select_options/(?P<table>[a-z_]+)$', ajax.select_options),

    (r'^interaction/geraete/info/(?P<geraet>\d+)$', interaction.geraete.info),
    (r'^interaction/geraete/delete/(?P<geraet>\d+)?$', interaction.geraete.delete),
    (r'^interaction/geraetemodelle/delete/(?P<geraetemodell>\d+)?$', interaction.geraetemodelle.delete),
    (r'^interaction/geraetegruppen/delete/(?P<geraetegruppe>\d+)?$', interaction.geraetegruppen.delete),
    # ...
)
from views import interaction
print dir(interaction)
。。。或者在导入中添加另一行:

from views.interaction import geraete, geraetemodelle, geraetegruppen
但是,使用views.interaction import*中的
也不起作用,并会产生相同的错误消息


第二次测试

我在/devices中创建了一个文件test.py:

# ...
from views import html, ajax, misc, interaction

urlpatterns = patterns('', 
    # ...
    (r'^ajax/update/(?P<table>[a-z_]+)$', ajax.update),
    (r'^ajax/delete/(?P<table>[a-z_]+)$', ajax.delete),
    (r'^ajax/select_options/(?P<table>[a-z_]+)$', ajax.select_options),

    (r'^interaction/geraete/info/(?P<geraet>\d+)$', interaction.geraete.info),
    (r'^interaction/geraete/delete/(?P<geraet>\d+)?$', interaction.geraete.delete),
    (r'^interaction/geraetemodelle/delete/(?P<geraetemodell>\d+)?$', interaction.geraetemodelle.delete),
    (r'^interaction/geraetegruppen/delete/(?P<geraetegruppe>\d+)?$', interaction.geraetegruppen.delete),
    # ...
)
from views import interaction
print dir(interaction)
输出:

simon@bsd-simon:~/projekte/pybsd/devices$ python test.py
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
同样,在交互包(geratete.py、geratemodelle.py、geratetgruppen.py)中没有我创建的模块的迹象

与URL.py中不同的是,在test.py中尝试从view.interaction导入geraete、geraetegruppen、geraetemodelle
时,会导致导入错误:这次没有名为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__']
$python manage.py shell
>>>导入设备.views.interaction.geratet
>>>dir(devices.views.interaction.geratet)
['Abteilung','Auftrag','AuftragsOrlage','Geraet','Geratetgruppe','GerateModell','HttpResponse','HttpResponseBadRequest','HttpResponseResponseRedirect','Raum','Standort','uuuu内置','uuuuuu文档','uuuuuuuu文件','uuuuuuu名称','uuuuuuu包','uuuuuuuu','删除','info','models','move','render uu to uu响应']
>>> 
$python manage.py shell
>>>从devices.views.interaction导入
>>>署长(杰拉特)
['Abteilung','Auftrag','AuftragsOrlage','Geraet','Geratetgruppe','GerateModell','HttpResponse','HttpResponseBadRequest','HttpResponseResponseRedirect','Raum','Standort','uuuu内置','uuuuuu文档','uuuuuuuu文件','uuuuuuu名称','uuuuuuu包','uuuuuuuu','删除','info','models','move','render uu to uu响应']
>>> 
$python manage.py shell
>>>导入设备。视图。交互
>>>设备.视图.交互.geraete
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:“module”对象没有属性“Geratet”
>>>目录(设备.视图.交互)
[“内置”、“文档”、“文件”、“名称”、“包”、“路径”]
当你说

import devices.views.interaction
后来

interaction.geraete
Python在交互包的
\uuu init\uuu.py
模块中查找Geratet


如果您想看到这一点,可以在
模块中显式地包含
导入Geratet

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

import views.interaction.gaerete
或者,如果您希望在导入
交互时
interaction.garaete
始终可用,则它可以是
交互/\uuuuu init\uuuuuuuuuuy

import gaerete

如果子模块未导入到
\uuuu init\uuuuuu.py
文件中,则应显式导入子模块:

import interaction.geraete

请把标题改一下。这其实与Django的关系不大,与Python本身的关系也不大。