82

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

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

+ src

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

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

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

我如何根据模块和包来组织它?模块和包的含义是什么?

4

8 回答 8

51

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

from Indicators.Stochastics import *

或者

from Indicators import Stochastics

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

于 2011-03-01T13:40:27.190 回答
41

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

像这样的文件结构

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(即使用小写名称)。

于 2011-03-01T13:49:35.437 回答
28

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

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
于 2013-01-23T04:06:57.357 回答
13

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

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

于 2011-03-01T14:43:49.133 回答
8

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

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

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

于 2015-09-28T17:42:46.197 回答
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/ 等。开发通常通过运行来完成

./bin/python setup.py tests

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

我就是这样做的。:-)

于 2011-03-01T13:57:02.730 回答
3

尝试python_boilerplate_template

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

于 2014-03-18T09:56:10.313 回答
2

cookiecutter项目audreyr包括几个 Python 项目模板:

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

例如,兼容的 Python 模板PyPI

cookiecutter-pypackage

于 2017-04-10T14:08:58.593 回答