1. ホーム
  2. パイソン

[解決済み】setup.pyで非Pythonファイルをインクルードする。

2022-04-01 12:26:46

質問

を作るにはどうしたらいいのでしょうか? setup.py は、コードの一部でないファイルをインクルードするのですか?(具体的には、ライセンスファイルですが、他のものでも構いません)。

ファイルの場所を制御できるようにしたいのですが。元のソースフォルダでは、ファイルはパッケージのルートにあります。(つまり、一番上の __init__.py .) OSに関係なく、パッケージがインストールされたときに、その場所に正確に留まるようにしたいのですが。どうすればいいのでしょうか?

解決方法は?

おそらく、最も良い方法は setuptools package_data ディレクティブを使用します。 これはつまり setuptools (または distribute の代わりに distutils しかし、これは非常にシームレスなアップグレードです。

以下は、完全な(しかし未試験の)例です。

from setuptools import setup, find_packages

setup(
    name='your_project_name',
    version='0.1',
    description='A description.',
    packages=find_packages(exclude=['ez_setup', 'tests', 'tests.*']),
    package_data={'': ['license.txt']},
    include_package_data=True,
    install_requires=[],
)

ここで重要なのは、特定の行に注目することです。

package_data={'': ['license.txt']},
include_package_data=True,

package_datadict のパッケージ名(空 = すべてのパッケージ)を、パターンのリスト(グロブを含むことができる)に変換します。 例えば、パッケージ内のファイルだけを指定したい場合、それも可能です。

package_data={'yourpackage': ['*.txt', 'path/to/resources/*.txt']}

ここでの解決策は、間違いなく ない の名前を変更することです。 py ファイルを .py という拡張子を持つ。

参照 イアン・ビッキングのプレゼンテーション をご覧ください。

UPDATE: もうひとつの[ベター]アプローチ

ソースディストリビューションの内容を制御したいだけなら、うまくいくもうひとつのアプローチ( sdist ) で、パッケージの外 (例えばトップレベルディレクトリ) にファイルがある場合、そのファイルに MANIFEST.in ファイルを作成します。 参照 Pythonのドキュメント は、このファイルのフォーマットについてです。

この回答を書いてから、私は MANIFEST.in は、一般的にソースディストリビューションを確認するだけで、あまりイライラしないアプローチです( tar.gz ) に必要なファイルが含まれています。

例えば requirements.txt をトップレベルから再帰的にインクルードします。

include requirements.txt
recursive-include data *

しかし、インストール時にこれらのファイルを site-packages 内のパッケージのフォルダにコピーするためには、以下のようにします。 include_package_data=Truesetup() 関数を使用します。参照 ノンコードファイルの追加 をご覧ください。