簡體   English   中英

如何組織 Python 項目?

[英]How to organize a Python Project?

我是 Python 新手,正在開始一個迷你項目,但我對如何以“Python 方式”組織文件夾有一些疑問。

我在我的開發環境中使用PyDev ,當我創建一個新項目時,會創建一個名為src的文件夾

+ src

現在,在PyDev ,我可以創建Pydev ModulePyDev Package

我需要按以下方式組織我的項目:

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

我如何根據模塊和包來組織它? 模塊和包的含義是什么?

一個包基本上是一個文件夾,在它下面有__init__.py文件,通常是一些模塊,其中模塊是一個*.py文件。 它主要與import 如果您將__init__.py添加到 Indicators 您可以使用:

from Indicators.Stochastics import *

要么

from Indicators import Stochastics

順便說一句,我建議保持模塊/包名稱小寫。 它不會影響功能,但它更“pythonic”。

從文件系統的角度來看,模塊是一個以.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 (即使用小寫名稱)。

參見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

生成文件

    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

您可能想查看現代包模板庫。 它提供了一種為項目設置非常好的基本布局的方法,它會引導您解決一些問題,並嘗試幫助您獲得能夠相當容易地分發的東西。

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

在決定項目結構之前,最好先問問自己項目的目的是什么。 這將是一次性分析嗎? 您想研究的玩具概念? 您打算分發一個完整的項目? 您想要在構建項目時付出的努力會有所不同。

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

包是一個包含__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 測試運行器來運行測試。

我就是這樣做的。 :-)

試試python_boilerplate_template

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

cookiecutter的項目audreyr包括一些Python項目模板:

該包使用單個~/.cookiecutterrc文件以 Python、Java、JS 和其他語言創建自定義項目模板。

例如,與PyPI兼容的 Python 模板:

cookiecutter-pypackage

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM