私のPythonアプリケーションでは、エントリポイント(スクリプト)とライブラリコードと考えるものを区別できます。
私の本能は、ライブラリコードをパッケージ内に配置し、スクリプトを他の場所にパッケージからインポートすることです。
Setup.pyを使用してパッケージ内のメソッドを参照し、エントリポイントとして使用することで、すべてのPythonコードをパッケージ内に含めることができます。
どちらが望ましいですか?
注: このリンク は両方のオプションについて説明していますが、実際には意見を述べていません。
編集:より具体的な例を示すために、1つのパッケージを含むいくつかのコードを確認しています。その中に40のモジュールがあります:
__init__.py
これはパッケージの機能をうまく使用しているようには思えませんが、正確に何が問題なのかを理解することはできません。
同じパッケージでテストを行うことは、元の質問には含まれていなかったことに感謝します。
2年後、自分の質問に答えられると思います。
Setuptools entry_points
メソッドを使用することをお勧めします。これは Click documentation でよく説明されており、主なポイントは次のとおりです。
はい、これは可能であり、コマンドラインツールとインポートされたライブラリの両方として機能するパッケージでは一般的です。
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
呼び出し可能なモジュール:
ライブラリコードを他のパッケージで使用する場合は、ライブラリコードをスクリプトから分離する必要があります。これは、setup.pyおよびrequirements.txtで依存関係を宣言する方法が原因です( ここ を参照)。
ライブラリコードがこれらのスクリプトでのみ使用される場合は、選択できます。私は物事を少し単純にするために、それらをまとめておくことを選択します