web-dev-qa-db-ja.com

Python Project?

私はPythonが初めてで、ミニプロジェクトを始めていますが、「Pythonの方法」でフォルダを整理する方法に疑問があります。

開発環境でPyDevを使用しています。新しいプロジェクトを作成すると、srcというフォルダーが作成されます

+ src

これで、PyDevで、Pydev ModuleおよびPyDev Package

次の方法でプロジェクトを整理する必要があります。

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

これをモジュールとパッケージに関して整理するにはどうすればよいですか?モジュールとパッケージの意味は何ですか?

宜しくお願いします、

72
André

パッケージは基本的に、その下に__init__.pyファイルと通常はいくつかのモジュールを持つフォルダーです。ここで、モジュールは*.pyファイルです。主にimportと関係があります。 __init__.pyをインディケーターに追加すると、使用できます:

from Indicators.Stochastics import *

または

from Indicators import Stochastics

ところで、モジュール/パッケージ名は小文字のままにすることをお勧めします。機能には影響しませんが、より「Python的」です。

46
Botond Béres

ファイルシステムの観点から見ると、module.pyで終わるファイルであり、packagemodulesと(ネストされた)packagesを含むフォルダーです。 Pythonは、__init__.pyファイルが含まれている場合、フォルダーをpackageとして認識します。

そのようなファイル構造

some/
    __init__.py
    foofoo.py
    thing/
        __init__.py
        barbar.py

packagesomeを定義します。これにはmodulefoofooがあり、ネストされたパッケージthingにはモジュールbarbarがあります。ただし、パッケージとモジュールを使用する場合、これらの2つのタイプを実際に区別しません。

import some

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

import some.foofoo # <- module
import some.thing # <- package

パッケージ/モジュールの命名を選択する場合は、 PEP8 に従ってください(つまり、小文字の名前を使用します)。

37
Oben Sonne

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

catMakefile

    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
26
Vitaly Fadeev

Modern-package-templateライブラリをチェックアウトすることをお勧めします。これは、いくつかの質問を順を追って説明し、かなり簡単に配布できるものを手に入れようとするプロジェクトに、本当にすてきな基本レイアウトをセットアップする方法を提供します。

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

13
Rick

プロジェクト構造を決定する前に、プロジェクトの目的が何であるかを自問するのは良いことです。これは1回限りの分析になりますか?調べたいおもちゃのコンセプトは?配布する予定の本格的なプロジェクトですか?プロジェクトの構造化に費やす労力は異なります。

  • 1回限りの分析の場合は、 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)するのに役立つすべてのツールがあります。

7
Alexander

パッケージは、__init__.pyが含まれるディレクトリです。ディレクトリとの違いは、ディレクトリをインポートできることです。

「Pythonの方法」自体はありませんが、プロジェクトに関連する名前を持つすべてのモジュールを1つのパッケージに入れることをお勧めします。

また、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テストランナーを使用してテストを実行します。

それが私のやり方です。 :-)

4
Lennart Regebro
3
KT.

cookiecutterによる audreyr プロジェクトには、いくつかのPythonプロジェクトテンプレート:

このパッケージは、単一の~/.cookiecutterrcファイルを使用して、Python、Java、JS、およびその他の言語でカスタムプロジェクトテンプレートを作成します。

たとえば、Python PyPIと互換性のあるテンプレート:

cookiecutter-pypackage

1
Anton Tarasenko