如何为模块编写Python的__init__.py文件

6
如果我的模块文件夹结构如下所示:

studio
    tools
        __init__.py
        camera
            __init__.py
            camera.py
        element
            __init__.py
            element.py

我该如何编写__init__.py文件,以便我可以像以下示例一样编写我的导入语句?在camera模块中有一个名为CameraNode的类对象,我希望能够像下面的示例那样调用它。
from studio import tools
    
tools.camera.fn()
tools.CameraNode('')
tools.element.fn()

3
它们只需要存在即可。我倾向于加上一个井号#,这样就不会有空文件了。 - Tim Roberts
我不确定我理解你在说什么 - JokerMartini
这个回答解决了你的问题吗?如何编写好的/正确的package __init__.py文件 - theProcrastinator
1
除了stackoverflow的帖子外,你可以通过这个链接浏览,它解释了许多用例。 - theProcrastinator
2个回答

11
如果您有一个如下的studio/tools/__init__.py文件:
from .camera import *
from .element import *

然后你可以在其他地方进行单次导入,例如:

from studio import tools

然后将所有内容引用,就好像它们直接在studio.tools中一样。

不确定这是否完全回答了您的问题,但希望它能使您朝正确的方向前进。


在相机和元素文件夹中的__init__.py文件中,我需要写什么内容? - JokerMartini
在Python 3中,你甚至不需要它们。"隐式命名空间包意味着完全可以放弃提供__init__.py文件的要求" -- https://www.python.org/dev/peps/pep-0420/ - dkamins

5

__init__.py文件允许您将任何目录视为Python包。在文件本身中不需要编写任何内容,只需在目录中创建即可。

因此,cameraelementtools可以作为包使用。

然而,如果您想要访问子目录中的Python文件,那么您必须在父目录的__init__.py中导入这些文件。

例如,如果您想执行tools.camera,则必须在tools目录的__init__.py中导入camera

否则,您将需要单独导入camera以访问其中的所有函数。


但是我该如何编写初始文件以便能够直接在子模块中访问方法和类呢?例如,camera.py 包含一个名为 CameraNode 的调用,我想要像 tools.CameraNode 一样访问它。 - JokerMartini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接