如何组织Python项目?

时间:2011-03-01 13:28:58

标签: python pydev project-structure project-organization

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

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

+ src

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

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

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

如何根据模块和包进行组织? Modules and Packages是什么意思?

最诚挚的问候,

8 个答案:

答案 0 :(得分:42)

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

from Indicators.Stochastics import *

from Indicators import Stochastics

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

答案 1 :(得分:36)

从文件系统的角度来看,module是以.py结尾的文件,而package是包含module和(嵌套){{1}的文件夹再次。如果文件夹包含package文件,则Python会将其识别为package

像这样的文件结构

__init__.py

定义some/ __init__.py foofoo.py thing/ __init__.py barbar.py package,其中包含some module和嵌套包foofoo,其中包含thing模块。但是,在使用包和模块时,您并没有真正区分这两种类型:

barbar

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

答案 2 :(得分:26)

请参阅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 Makefile

    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

答案 3 :(得分:13)

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

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

答案 4 :(得分:7)

在决定项目结构之前,最好先问问自己项目的目的是什么。这会是一次性分析吗?你想调查的玩具概念?您打算分发的完整项目?您希望用于构建项目的工作量将有所不同。

  • 如果是一次性分析,我喜欢使用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)的工具。

答案 5 :(得分:4)

包是一个__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 / et al。开发通常通过运行

来完成
./bin/python setup.py tests

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

我就是这样做的。 : - )

答案 6 :(得分:3)

尝试python_boilerplate_template

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

答案 7 :(得分:1)

audreyr ~/.cookiecutterrc项目包括几个Python项目模板:

该软件包使用单个PyPI文件以Python,Java,JS和其他语言创建自定义项目模板。

例如,与CPPUNIT_ASSERT(condition); 兼容的Python模板:

https://github.com/audreyr/cookiecutter-pypackage