如何组织Python项目?

And*_*dré 72 python project-structure project-organization pydev

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

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

+ src
Run Code Online (Sandbox Code Playgroud)

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

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

+ Indicators
    - Moving_averages.py
    - Stochastics.py
+ Strategies
    - Moving_averages_cross.py
- example.py
Run Code Online (Sandbox Code Playgroud)

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

最好的祝福,

Bot*_*res 47

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

from Indicators.Stochastics import *
Run Code Online (Sandbox Code Playgroud)

要么

from Indicators import Stochastics
Run Code Online (Sandbox Code Playgroud)

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


Obe*_*nne 37

从文件系统的角度来看,a .py是以__init__.py和结尾的文件,a some是再次包含foofoos和(嵌套)thing的文件夹.Python将文件夹识别为barbar包含.py文件的文件夹.

像这样的文件结构

some/
    __init__.py
    foofoo.py
    thing/
        __init__.py
        barbar.py
Run Code Online (Sandbox Code Playgroud)

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

import some

some.dothis() # dothis is defined in 'some/__init__.py'

import some.foofoo # <- module
import some.thing # <- package
Run Code Online (Sandbox Code Playgroud)

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

  • 如果我只输入一些,我可以从`foofoo.py`调用该函数吗?我对`__init __.py`感到困惑,我应该把它放在那里? (2认同)

Vit*_*eev 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 嗨,维塔利!我刚碰到你的项目.你还在维护吗?谢谢! (2认同)
  • 结束了404 (2认同)
  • 链接“ https://github.com/vital-fadeev/python-package-template”不再有效。在哪里可以找到此python-package-template? (2认同)

Ric*_*ick 13

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

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


Ale*_*der 7

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

  • 如果是一次性分析,我喜欢使用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
    
    Run Code Online (Sandbox Code Playgroud)

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