【问题标题】:How to organize a Python Project?如何组织 Python 项目?
【发布时间】:2011-07-06 12:33:16
【问题描述】:

我是 Python 新手,我正在开始一个迷你项目,但我对如何以“Python 方式”组织文件夹有些疑问。

我在我的开发环境中使用PyDev,当我创建一个新项目时,会创建一个名为src的文件夹

+ src

现在,在PyDev 中,我可以创建Pydev ModulePyDev Package

我需要按以下方式组织我的项目:

+ Indicators
    - Moving_averages.py
    - Stochastics.py
+ Strategies
    - Moving_averages_cross.py
- example.py

如何根据模块和包来组织它?模块和包是什么意思?

【问题讨论】:

标签: python pydev project-structure project-organization


【解决方案1】:

包基本上是一个文件夹,其下有__init__.py 文件,通常是一些模块,其中模块是*.py 文件。 它主要与import 有关。如果您将__init__.py 添加到指标中,您可以使用:

from Indicators.Stochastics import *

from Indicators import Stochastics

顺便说一句,我建议将模块/包名称保持小写。它不影响功能,但更“pythonic”。

【讨论】:

    【解决方案2】:

    从文件系统的角度来看,模块是以.py 结尾的文件,包是包含模块和(嵌套)包的文件夹。如果文件夹包含__init__.py 文件,Python 会将其识别为包。

    这样的文件结构

    some/
        __init__.py
        foofoo.py
        thing/
            __init__.py
            barbar.py
    

    定义包some,它有一个模块foofoo和一个嵌套的包thing,它又有一个模块barbar。但是,在使用包和模块时,您并没有真正区分这两种类型:

    import some
    
    some.dothis() # dothis is defined in 'some/__init__.py'
    
    import some.foofoo # <- module
    import some.thing # <- package
    

    在选择命名您的包/模块时请遵循PEP8(即使用小写名称)。

    【讨论】:

    • 如果我只导入一些,我可以从foofoo.py调用函数吗?我对__init__.py 感到困惑,我应该在那里放什么?
    【解决方案3】:

    python-package-template

    目录结构

        .
        |-- bin
        |   `-- my_program
        |-- docs
        |   `-- doc.txt
        |-- my_program
        |   |-- data
        |   |   `-- some_data.html
        |   |-- __init__.py
        |   |-- submodule
        |   |   `-- __init__.py
        |   |-- helpers.py
        |-- tests
        |   |-- __init__.py
        |   |-- test_helpers.py
        |-- Makefile
        |-- CHANGES.txt
        |-- LICENSE.txt
        |-- README.md
        |-- requirements-dev.txt
        |-- requirements.txt
        `-- setup.py
    

    cat 生成文件

        PYTHON=`which python`
        NAME=`python setup.py --name`
    
    
        all: check test source deb
    
        init:
            pip install -r requirements.txt --use-mirrors
    
        dist: source deb
    
        source:
            $(PYTHON) setup.py sdist
    
        deb:
            $(PYTHON) setup.py --command-packages=stdeb.command bdist_deb
    
        rpm:
            $(PYTHON) setup.py bdist_rpm --post-install=rpm/postinstall --pre-uninstall=rpm/preuninstall
    
        test:
            unit2 discover -s tests -t .
            python -mpytest weasyprint
    
        check:
            find . -name \*.py | grep -v "^test_" | xargs pylint --errors-only --reports=n
            # pep8
            # pyntch
            # pyflakes
            # pychecker
            # pymetrics
    
        clean:
            $(PYTHON) setup.py clean
            rm -rf build/ MANIFEST dist build my_program.egg-info deb_dist
            find . -name '*.pyc' -delete
    

    【讨论】:

    • 嗨,维塔利!我刚刚遇到了你的项目。你还在维护吗?谢谢!
    • 以 404 结束
    • 链接https://github.com/vital-fadeev/python-package-template 不再有效。在哪里可以找到这个 python-package-template?
    【解决方案4】:

    您可能想查看modern-package-template 库。它提供了一种为项目设置非常好的基本布局的方法,引导您完成几个问题并尝试帮助您获得能够相当容易分发的东西。

    http://pypi.python.org/pypi/modern-package-template

    【讨论】:

      【解决方案5】:

      在决定项目结构之前,最好问问自己项目的目的是什么。这会是一次性的分析吗?您想研究的玩具概念?您打算分发的完整项目?您希望为构建项目而付出的努力会有所不同。

      • 如果是一次性分析,我喜欢使用ipython notebooks。笔记本会记录您的思路,您可以在代码中添加注释以供日后参考。
      • 如果您想研究一个玩具概念,我会找到一种最简单、快速的方法。您希望能够快速实施您的概念,以发现它是否可行,因此值得花更多时间在上面。 Python 哲学的一部分是“不要追求完美,因为“足够好”往往就是这样。您可以稍后再回来,按照最佳软件工程实践的方式构建您的项目。
      • 如果您想构建您的项目以便以后分发它,并使其扩展到许多模块,我建议您采用以下结构:

        projectname
         ├── MANIFEST.in
         ├── setup.py
         ├── README
         ├── .gitignore
         ├── .git
         ├── projectname_env
         └── projectname
             ├── __init__.py
             ├── subpackageone
             │   ├── __init__.py
             │   ├── second_module.py
             │   ├── tests
             │   │   └── test_second_module.py
             │   └── models
             │       └── model1
             ├── first_module.py   
             └── tests
                 └── test_second_module.py
        

      我喜欢这种结构are in my blog post的详细原因,但基本要点是层次较低的projectname目录包含您的实际项目。除此之外,还有所有帮助管理 (git) 和打包 (setup.py, MANIFEST.in) 的工具。

      【讨论】:

      • 您将如何运行您的项目?在根文件夹中做python3 -m projectname?
      【解决方案6】:

      包是一个包含__init__.py 的目录。与目录的区别在于可以导入。

      本身并没有“Python 方式”,但您会发现将所有模块放在一个包中并使用与项目相关的名称是一个好主意。

      此外,为了遵循 Python 样式指南 PEP8,包和模块名称应全部小写。因此,如果我们假设该项目名为“Botond Statistics”,您的结构将是这样的:

      botondstats/
          indicators/
              moving_averages.py
              stochastics.py
          strategies/
              moving_averages_cross.py
          example.py
      

      然后你会找到 Stochastics 类

      from botondstats.indicators.stochastics.Stochastics
      

      (有多种方法可以保持结构,但可以缩短导入时间,但这是另一个问题)。

      如果您愿意,可以将此结构放在src/ 下,但这不是必需的。我从来没有做。 相反,我有一个主目录:

      BotondStatistics/
          docs/
          botonstats/ # the above structure
          setup.py    # Distutils/distribute configuration for packaging.
      

      在这个目录中,我通常还有一个 virtualenv,所以我实际上也有 bin/lib/ 等。开发通常通过运行来完成

      ./bin/python setup.py tests
      

      因为我使用 Distrubute 测试运行器来运行测试。

      我就是这样做的。 :-)

      【讨论】:

        【解决方案7】:

        试试python_boilerplate_template

        https://pypi.python.org/pypi/python_boilerplate_template

        【讨论】:

          【解决方案8】:

          audreyrcookiecutter 项目包括几个 Python 项目模板:

          该包使用单个 ~/.cookiecutterrc 文件以 Python、Java、JS 和其他语言创建自定义项目模板。

          例如兼容PyPI的Python模板:

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-10-21
            • 1970-01-01
            • 2010-09-28
            • 2021-05-09
            • 1970-01-01
            • 2013-05-27
            • 1970-01-01
            • 2012-06-02
            相关资源
            最近更新 更多