Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通用Python模块_Python_Module - Fatal编程技术网

通用Python模块

通用Python模块,python,module,Python,Module,我知道以前有人问过这个问题,但我仍然在努力学习python模块。 我的应用程序有一个非常基本的结构: app/ __init__.py driver.py dbloader/ __init__.py loader.py 两个\uuuu init\uuuuu.py文件都是空的driver.py只有一个类driver(),而loader.py中只有类loader() 因此,要测试此设置,请在app/目录中插入cd。从这里开始,我创建了一个pythonshell

我知道以前有人问过这个问题,但我仍然在努力学习python模块。 我的应用程序有一个非常基本的结构:

app/
   __init__.py
   driver.py
   dbloader/
     __init__.py
     loader.py
两个
\uuuu init\uuuuu.py
文件都是空的
driver.py
只有一个类driver(),而
loader.py
中只有类loader()

因此,要测试此设置,请在app/目录中插入
cd
。从这里开始,我创建了一个pythonshell。然后我尝试:

import dbloader
有效(即无错误)。然而,我尝试了所有的排列,试图在
Loader.py
中实例化Loader(),但没有成功。我试过的几种方法是:

from dbloader import loader
from dbloader.loader import Loader
我也试过了

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

import dbloader
l = dbloader.Loader()
都没有用。我相信从别处读到的信息表明,在执行pythonshell时,当前目录和子目录会自动包含在pythonpath中(这是真的吗?)


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

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中使用
dir
help
,您应该能够更好地理解该结构。

dbloader
本身没有任何对
Loader
类的引用。无论您如何操作,都需要遍历
加载程序
名称空间。因此,有两种可能的方法:

from dbloader import loader
l = loader.Loader()


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

除了使用Daenyth和Daniel Roseman提出的解决方案,如果从dbloader中导入Loader,则可以直接从
dbloader
访问
Loader

# app/dbloader/__init__.py
from dbloader.loader import Loader
然后,在您的shell中:

import dbloader
l = dbloader.Loader()

# or...

from dbloader import Loader
l2 = Loader()

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

当您导入dbloader l=dbloader.Loader()时,会出现什么错误?我不知道为什么您会看到这两个解决方案出现问题:
来自dbloader import Loader
来自dbloader.Loader import Loader
。第一个应提供
Loader
作为
Loader.Loader
,第二个作为
Loader
。你能发布堆栈跟踪吗?Niek和Darth,我得到的错误是“无法导入名称加载器”,但它已经按照Daniel的建议进行了修复,下面的建议看起来与我已经在做的类似,所以这可能是一个很糟糕的胖手指案例。需要它通常是一个提示,表明您的模块结构是错误的。@Daenyth我不会说“通常”。如果您有一个非常大的自包含类,那么将其放在自己的文件中是有意义的。例如,在
util
模块中,数学向量类
vector
从util.vector import vector以
的形式到处导入会很烦人。这可能是一个有效的例子,但我指的更多的是从java获得延迟的东西,比如当类为10行时,每个文件一个类(一开始甚至不需要成为一个班级……)啊,我明白你的意思了。所有学习python的Java程序员首先应该读的是这篇文章。非常感谢。这帮助我澄清了一些事情。实际上,如果
dbloader
\uu init\uuuuuu.py
是空的,那么执行以下操作:
导入dbloader;dbloader.loader
将失败,因为
导入dbloader
很简单执行
\uuuu init\uuuuuuu.py
文件并将名称
dbloader
链接到它的作用域,该作用域中不存在
loader
。您需要从dbloader import loader
import dbloader.loader
运行
,以访问
loader
import dbloader
l = dbloader.Loader()

# or...

from dbloader import Loader
l2 = Loader()