【问题标题】:Python 3: Large Application Structure [closed]Python 3:大型应用程序结构
【发布时间】:2013-07-22 15:32:28
【问题描述】:

已编辑以提供更清晰的问题

是否有推荐或标准的方式来组织大型 python 应用程序——例如,需要不同子目录中的多个文件来组织清晰的项目。

我能找到的所有文档都在谈论包,在我看来,这在任何其他语言中都可以称为库。即主程序包含/需要的代码。包中的 setup.py 增加了这种混乱,因为它看起来应该是整个应用程序的主程序/脚本,但它被用来将模块作为库“安装”。

简而言之,将代码组织为应用程序(您实际运行的程序)的标准/建议。不是库/包(应用程序包含/使用的东西)

【问题讨论】:

  • 一个 Python 文件一个模块。问如何在不使用模块的情况下组织多个 Python 文件是没有意义的。
  • @Ryhnn 任何带有 setup.py 的应用程序都将是一个包。这并不意味着它同时不是一个独立的应用程序。包只是将多个模块组合在一起的一种形式,类似于命名空间。它与“图书馆”的含义不同。您很可能希望将您的应用程序作为一个包分发。
  • @Ryhnn 我在下面的评论中提到了它,但这更多地解释了 setup.py pythonhosted.org/distribute/… 中的入口点定义 - 包中没有“主要”入口点。只有通过脚本公开的功能。

标签: python python-3.x


【解决方案1】:

为了消除一些混乱,setup.py安装 脚本,而不是主要入口点。 Python 应用程序可能包含多种与“主要入口点”交互的方式,包括几个命令行脚本、一个可以使用python -m name.of.package 执行的“主要”入口点和一个 GUI。

如果您需要包含通常包含在应用程序顶层的额外数据:

your_project_root/
    data/
        additional/
        directories/
        and.files
    project_name/
        __init__.py
        package.py
        and.py
        module.py
        files.py
        go/
            __init__.py
            here.py
    setup.py
    README.rst
    # Other top-level stuff as needed

【讨论】:

  • 谢谢,这清楚了很多。但是,python 怎么知道“主入口点”在哪里呢?
  • @Ryhnn python 本身对此一无所知。您只需执行一个文件或模块,就是这样。但通常设置脚本会处理这些类型的事情,例如通过在您的路径中添加一个适当命名的 bash 脚本,该脚本使用正确的模块/文件调用 python 解释器。
  • 没有“主要”入口点。您可以拥有任意数量的自动生成的脚本来调用您的库。查看pythonhosted.org/distribute/… 了解如何定义它们。
【解决方案2】:

好的,setup.py 文件是安装程序脚本,而不是主程序。将 setup.py 文件想象成 Window Installer。

Python 文件称为模块。现在,假设您有一个分为几个模块的应用程序。你可以做两件事:

1.将附加模块放在与主脚本相同的目录中,以便可以导入。

2.在主脚本的目录中创建一个单独的文件夹,并将附加模块以及 __init__.py 脚本放在那里。这是一个包。

现在,您可能想知道 __init__.py 文件到底做了什么。它的作用是告诉 Python 如何导入文件夹中的模块。这是一个示例:

import module1, module2'

__all__ = ['module1', 'module2']

__all__ 变量告诉 Python 哪些模块可以从外部导入。导入实际上告诉 Python 在您导入包时导入了哪些模块。包名称是文件夹名称。假设文件夹名为 hello。你会像这样导入包:

import hello

#Do stuff with hello

hello.module1.somefunction()

因此,init 文件中的导入告诉 Python 在您导入包时导入了哪些模块。

但是,假设您不想导入所有的 hello。假设您只想要模块1。你会这样做:

from hello import module1

module1.somefunction()

这就是 __all__ 变量的用途。它告诉 Python 可以单独导入什么。

如果您需要进一步说明,请发表评论。

【讨论】:

  • 这个解释得很好。谢谢!
【解决方案3】:

组织大型应用程序的一种方法(不是唯一方法)是使用virtualenvbuildout 的组合。

virtualenv 允许您创建一个独立的 Python 环境。这很重要,因为任何大型 Python 应用程序都将依赖于一堆包(有些是您自己编写的,有些是您从其他地方安装的)。当您的系统 python 已经安装了 3.2.1 版本时,您不希望您的应用程序需要 1.2.3 版本的包,因此您需要将您的应用程序与任何其他正在运行的应用程序隔离开来。

buildout 很有用,因为它允许您定义应用程序的所有依赖项并从头开始重复构建它。

使用buildout的项目目录结构如下:

project/
   bootstrap.py
   buildout.cfg
   .installed.cfg
   parts/
   develop-eggs/
   bin/
       buildout
       mypython
   eggs/
   downloads/

bootstrap.py 文件是构建的标准文件,并创建包含本地 python 和 buildout 命令的 bin 文件夹。 bin\buildout 然后使用buildout.cfg(这是您实际必须创建的唯一文件)来下载和安装您的应用程序所需的所有其他内容。 .installed.cfg 保存已运行命令的记录,因此如果更新了 buildout.cfg 并重新运行 bin/buildout,它可以卸载不再需要的任何内容并安装新的内容。

Plone 和 Django 等大型 Python 项目使用 buildout,请参阅 http://jacobian.org/writing/django-apps-with-buildout/ 以获得描述它的优秀博文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多