一般Python模块

时间:2012-05-02 15:54:41

标签: python module

我之前已经问过这个问题了,但我还是试着用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中(这是真的吗?)

无论如何,我们非常感谢任何协助。

3 个答案:

答案 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 XX添加到您的命名空间。

import dbloader - 这会添加module dbloader。你可以通过dbloader.loader.Loader

来上课

from dbloader import loader - 这会将模块loader添加到您的命名空间。您可以使用loader.Loader访问您的课程。

from dbloader.loader import Loader - 这会将类Loader导入您的命名空间。你只需在这里使用Loader()

尝试使用dirhelp在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()

这是清理名称空间的一个很好的解决方案。