如何组织一个Python项目?


76

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

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

+ src

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

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

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

我该如何按照模块和软件包进行组织?模块和软件包的含义是什么?

最好的祝福,


1
我可以在官方Python教程中推荐链接。是否非常清楚和直接。
LiorK

Answers:


49

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

from Indicators.Stochastics import *

要么

from Indicators import Stochastics

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


40

从文件系统的角度来看,模块是以结尾的文件,.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


2
foofoo.py如果仅导入一些函数,可以从中调用该函数吗?我对感到困惑__init__.py,应该在那放什么?
Jay Wong

27

参见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

2
嗨,维塔利!我刚遇到您的项目。您还在维护吗?谢谢!
Elias Dorneles 2014年

2
最终得到404
Dimitrios Mistriotis

2
该链接https://github.com/vital-fadeev/python-package-template不再有效。在哪里可以找到此python-package-template?
牙签海葵


8

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

  • 如果是一次性分析,我喜欢使用ipython笔记本。笔记本将记录您的想法,您可以在代码中添加标记注释以供以后参考。
  • 如果您想研究一个玩具概念,我会找到一种简单,快速的方法以使其发挥最佳效果。您希望能够快速实施您的概念,以发现它是否可行,因此值得花更多时间在它上面。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)的工具。


您将如何运行您的项目?在根文件夹里做什么python3 -m projectname
buhtz

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测试运行程序运行测试时。

这就是我的方法。:-)



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.