web-dev-qa-db-ja.com

Pythonパッケージ内にスクリプトを含める必要がありますか?

私のPythonアプリケーションでは、エントリポイント(スクリプト)とライブラリコードと考えるものを区別できます。

私の本能は、ライブラリコードをパッケージ内に配置し、スクリプトを他の場所にパッケージからインポートすることです。

Setup.pyを使用してパッケージ内のメソッドを参照し、エントリポイントとして使用することで、すべてのPythonコードをパッケージ内に含めることができます。

どちらが望ましいですか?

注: このリンク は両方のオプションについて説明していますが、実際には意見を述べていません。

編集:より具体的な例を示すために、1つのパッケージを含むいくつかのコードを確認しています。その中に40のモジュールがあります:

  • __init__.py
  • 11「スクリプト」
  • これらのスクリプトで使用される10個の「ライブラリモジュール」
  • 18個のテストモジュール

これはパッケージの機能をうまく使用しているようには思えませんが、正確に何が問題なのかを理解することはできません。

同じパッケージでテストを行うことは、元の質問には含まれていなかったことに感謝します。

3
wrgrs

2年後、自分の質問に答えられると思います。

Setuptools entry_pointsメソッドを使用することをお勧めします。これは Click documentation でよく説明されており、主なポイントは次のとおりです。

  • これはWindowsでうまく機能します
  • pythonpathはSetuptoolsによって管理されているため、(たとえば)スクリプトがvirtualenv内にインストールされている場合、virtualenvをアクティブにしてスクリプトを正しく動作させる必要はありません。
1
wrgrs

はい、これは可能であり、コマンドラインツールとインポートされたライブラリの両方として機能するパッケージでは一般的です。

setup.pyで、モジュールの関数をエントリポイントとして追加します。

setuptools.setup(
    ...
    entry_points={'console_scripts': [
        'foo = my_package.some_module:main_func',
    ]},
    ...
)

my_func内のmy_package.some_module関数を呼び出すfooという名前のスクリプトを作成します。詳しくは https://pythonhosted.org/setuptools/setuptools.html#automatic-script-creation をご覧ください。

追加するのも慣例です:

#!/usr/bin/env python

...

if __name__ == '__main__':
    my_func()

「スクリプト」として呼び出すことができるモジュールにmy_funcは、外部から呼び出したい関数です。


setup.pyの例を次に示します。

https://github.com/jacebrowning/gdm/blob/fa998167f5f6de64bc8bdfd8b9433870d79ef814/setup.py#L28-L31

呼び出し可能なモジュール:

https://github.com/jacebrowning/gdm/blob/fa998167f5f6de64bc8bdfd8b9433870d79ef814/gdm/cli.py#L161-L162

3
Jace Browning

ライブラリコードを他のパッケージで使用する場合は、ライブラリコードをスクリプトから分離する必要があります。これは、setup.pyおよびrequirements.txtで依存関係を宣言する方法が原因です( ここ を参照)。

ライブラリコードがこれらのスクリプトでのみ使用される場合は、選択できます。私は物事を少し単純にするために、それらをまとめておくことを選択します

0
Pierre