GitHub上的Python文件结构

9 投票
3 回答
3716 浏览
提问于 2025-04-17 18:10

我最近在看一些开源的Python项目,发现里面有很多我不太熟悉的文件和结构。

首先,很多项目都有一个叫做 setup.py 的文件,这个文件通常只包含一个函数:

setup(blah, blah, blah)

其次,很多项目里还有一个叫 __init__.py 的文件,里面几乎没有什么内容。

第三,有些 .py 文件里会有类似这样的语句:

if __name__ == "__main__"

最后,我想知道在git仓库中,分割Python文件有没有什么“最佳实践”。在Java中,文件的划分比较自然,因为有类的结构。而在Python中,很多脚本根本没有类,有时候程序会有面向对象的特性,但按类来划分文件并不太合理。是不是只要“让代码更易读”就行,还是说这方面有一些指导原则呢?

3 个回答

2

除了@poke的回答之外,可以看看这个相关的问题,它讨论了Python项目的目录结构应该是什么样的。还有这里有一个很实用的教程,教你如何让你的项目更容易运行。

2

setup.py 是 Python 中一个叫做 distutils 的工具的一部分。你如果想要分享一个模块,而不仅仅是一个简单的脚本,就需要这个文件(即使是简单脚本,拥有这个文件也是个好主意,这样将来可以方便地扩展成模块)。

__init__.py 是 Python 中 导入模块 的一部分:

命名为 init.py 的文件用于标记磁盘上的目录为 Python 包目录。如果你有这些文件:

mydir/spam/init.py、mydir/spam/module.py,并且 mydir 在你的路径中,你可以这样导入 module.py 中的代码:

import spam.module 或者

from spam import module 如果你删除了 init.py 文件,Python 就不会再在那个目录中查找子模块了,所以尝试导入模块会失败。

if __name__ == "__main__" 是一种方式,用来指示如果这个文件被直接运行而不是被导入时,哪些代码会被执行。

关于如何布局你的代码,distfiles 的文档中有一个 很好的指南

7

setup.py 是 Python 模块分发的一部分,它使用了一个叫做 分发工具。这个文件可以让你很方便地安装 Python 模块,特别是当你想把你的项目作为一个完整的 Python 模块来分享时,它就特别有用了。

__init__.py 是 Python 的 包系统的一部分。通常情况下,一个空文件就足够让 Python 识别它所在的目录是一个包了,但你也可以在里面定义一些其他的内容。

最后,__name__ == '__main__' 这个检查是为了确保当前的脚本是直接运行的(比如从命令行运行),而不是被其他脚本导入。在执行 Python 脚本时,只有一个模块的 __name__ 属性会等于 __main__。你可以查看 我在这里的回答,或者更一般的关于这个主题的 问题

撰写回答