2

我看到以前有人问过这个问题,但我仍在努力解决使用 python 模块的问题。我的应用程序有一个非常基本的结构:

app/
   __init__.py
   driver.py
   dbloader/
     __init__.py
     loader.py

两个__init__.py文件都是空的。driver.py只有一个类 Driver() 并且loader.py只有一个类 Loader()

所以,要测试这个设置,cd到 app/ 目录里面。从这里我开始一个 python shell。然后我尝试:

import dbloader哪个有效(即没有错误)。但是,我已经尝试了所有排列以在内部实例化 Loader()loader.py无济于事。我尝试过的一些是:

from dbloader import loader
from dbloader.loader import Loader

我也试过

只导入 dbloader 然后尝试实例化如下:

import dbloader
l = dbloader.Loader()

一切都无济于事。我相信在其他地方读到当前目录和子目录在执行 python shell 时会自动包含在 pythonpath 中(这是真的吗?)

无论如何,任何帮助将不胜感激。

4

3 回答 3

3

dbloader本身没有对Loader类的任何引用。不管你怎么做,你都需要通过loader命名空间。所以,两种可能的方式:

from dbloader import loader
l = loader.Loader()

或者

from dbloader.loader import Loader
l = Loader()

它有助于考虑命名空间,而不是模块或类。Loader位于dbloader.loader命名空间中,并且要访问该类,您需要将类本身或包含它的模块导入当前命名空间。

于 2012-05-02T16:05:43.647 回答
2

import X添加X到您的命名空间。

import dbloader- 这添加了模块 dbloader。你会和你一起上课dbloader.loader.Loader

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

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

尝试在 python shell 中使用dirand help,你应该能够更好地理解结构。

于 2012-05-02T16:05:23.030 回答
0

除了使用 Daenyth 和 Daniel Roseman 提出的解决方案外,如果你在 dbloader 中 from-import Loader ,你可以Loader直接访问 from :dbloader

# app/dbloader/__init__.py
from dbloader.loader import Loader

然后,在您的外壳中:

import dbloader
l = dbloader.Loader()

# or...

from dbloader import Loader
l2 = Loader()

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

于 2012-05-02T16:20:30.433 回答