Python 3:大型应用程序结构

时间:2013-07-23 13:56:19

标签: python python-3.x

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

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

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

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

3 个答案:

答案 0 :(得分: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导入包时导入哪些模块。

但是,说你不想导入所有你好。假设你只想要module1。你这样做:

from hello import module1

module1.somefunction()

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

如果您需要进一步澄清,请发表评论。

答案 1 :(得分: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

答案 2 :(得分:1)

组织大型应用程序的一种方式(不是唯一的方法)是使用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文件是buildout的标准文件,并创建包含本地python和bin命令的buildout文件夹。 bin\buildout然后使用buildout.cfg(这是您实际创建的唯一文件)来下载和安装应用程序所需的其他所有内容。 .installed.cfg包含已运行命令的记录,因此如果更新buildout.cfg并重新运行bin/buildout,它可以卸载不再需要的任何内容并安装任何新内容。

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