1

我正在将一些 matlab 代码移植到 python。在这种情况下,我需要使用包和模块。相关的包目录结构如下所示:

toppackage
    __init__.py
    subpackage
        __init__.py
        module.py
        ...

在我使用包的脚本中,我可以这样工作:

from toppackage.subpackage.module import SomeClass
s = SomeClass()

但我更喜欢这样工作:

import toppackage %somewhere at the beginning of file
s = toppackage.subpackage.module.SomeClass()

我看到这是在 numpy 中完成的。但我在文档中找不到它。我怎样才能做到这一点?

提前致谢。

4

2 回答 2

2

您需要在__init__.py文件中导入包含的包。

您可以导入其中的包toppackage/__init__.py,例如:

import toppackage.subpackage.module

或者你可以只导入每个直接包含的包,所以在toppackage/__init__.py

from . import subpackage

并在toppackage/subpackage/__init__.py

from . import module

仅导入顶级包不会自动使包含的包可用。在此之前,您需要在某处明确导入一次完整路径。

numpy包导入顶层中的嵌套包__init__.py

于 2013-05-08T15:04:17.347 回答
1

这些东西如何工作主要取决于__init__.py. 在该脚本中导入的任何内容都将成为包命名空间的一部分。

例如,如果您toppackage/__init__.py是空的,要访问subpackage,您需要执行以下操作:

import toppackage
try:
    p = toppackage.subpackage
except AttributeError:
    print "you would see this"

import toppackage.subpackage
p = toppackage.subpackage #no error now

但是,如果toppackage/__init__.py包括该行:

#toppackage/__init__.py
import subpackage

那么上面的脚本不会引发异常。

如评论中所述,您还可以使用相对导入,因为您在一个包中:

from . import subpackage

这避免了“命名空间”冲突——例如,如果您有一个名为的子包os,它将获得您的子包而不是 python 级别的包。

于 2013-05-08T15:03:39.917 回答