我之前已经问过这个问题了,但我还是试着用python模块来解决问题。 我的应用程序有一个非常基本的结构:
app/
__init__.py
driver.py
dbloader/
__init__.py
loader.py
两个__init__.py
个文件都是空的。 driver.py
只有一个类Driver(),而loader.py
只有一个类Loader()
因此,要在app /目录中测试此设置,cd
。从这里我开始一个python shell。然后我尝试:
import dbloader
有效(即没有错误)。但是,我已经尝试了每个排列来实例化loader.py
内的Loader()无济于事。我尝试过的几个是:
from dbloader import loader
from dbloader.loader import Loader
我也试过
仅导入dbloader,然后尝试实例化如下:
import dbloader
l = dbloader.Loader()
一切都无济于事。我相信在其他地方读取当前目录和子目录在执行python shell时会自动包含在pythonpath中(这是真的吗?)
无论如何,我们非常感谢任何协助。
答案 0 :(得分:3)
dbloader
本身没有对Loader
类的任何引用。无论如何,您需要遍历loader
命名空间。所以,有两种可能的方式:
from dbloader import loader
l = loader.Loader()
或
from dbloader.loader import Loader
l = Loader()
考虑名称空间而不是模块或类是有帮助的。 Loader
位于dbloader.loader
命名空间中,要访问该类,您需要将类本身或包含它的模块导入当前命名空间。
答案 1 :(得分:2)
import X
将X
添加到您的命名空间。
import dbloader
- 这会添加module dbloader
。你可以通过dbloader.loader.Loader
from dbloader import loader
- 这会将模块loader
添加到您的命名空间。您可以使用loader.Loader
访问您的课程。
from dbloader.loader import Loader
- 这会将类Loader
导入您的命名空间。你只需在这里使用Loader()
。
尝试使用dir
和help
在python shell中玩游戏,你应该能够更好地理解结构。
答案 2 :(得分:0)
除了使用Daenyth和Daniel Roseman提出的解决方案之外,如果您在dbloader中导入Loader,则可以直接从Loader
访问dbloader
:
# app/dbloader/__init__.py
from dbloader.loader import Loader
然后,在你的shell中:
import dbloader
l = dbloader.Loader()
# or...
from dbloader import Loader
l2 = Loader()
这是清理名称空间的一个很好的解决方案。