setup.py に Python 以外のファイルを含める
質問
どうやって作るの? setup.py
コードの一部ではないファイルを含めますか?(具体的にはライセンス ファイルですが、その他のファイルでもかまいません。)
ファイルの場所を制御できるようにしたい。元のソース フォルダーでは、ファイルはパッケージのルートにあります。(すなわち、一番上と同じレベルにある __init__.py
.) オペレーティング システムに関係なく、パッケージのインストール時に正確にそこに留まりたいと考えています。それ、どうやったら出来るの?
解決
おそらくこれを行う最良の方法は、 setuptools
package_data
ディレクティブを使用することです。これは、 setuptools
(または distutils
ではなく distribute
)ですが、これは非常にシームレスな&quot ;アップグレード"。
ここに完全な(ただしテストされていない)例があります:
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_data
は、パッケージ名(空=すべてのパッケージ)からパターンのリスト(グロブを含めることができる)への dict
です。たとえば、パッケージ内のファイルのみを指定する場合は、それも実行できます。
package_data={'yourpackage': ['*.txt', 'path/to/resources/*.txt']}
ここでの解決策は、 .py
拡張子を持つ py
以外のファイルの名前を変更しないことです。
詳細については、 Ian Bickingのプレゼンテーションを参照してください。
更新:別の[より良い]アプローチ
ソース配布( sdist
)の内容を制御したいだけで、パッケージの外にファイル(トップレベルディレクトリなど)がある場合にうまく機能する別のアプローチは、 MANIFEST.in
ファイル。このファイルの形式については、 Pythonのドキュメントをご覧ください。
このレスポンスを書いて以来、 MANIFEST.in
を使用することは、ソースディストリビューション( tar.gz
)が単に必要なファイル。
たとえば、トップレベルの requirements.txt
を含める場合は、トップレベルの「データ」を再帰的に含めます。ディレクトリ:
include requirements.txt
recursive-include data *
それでも、これらのファイルをインストール時にサイトパッケージ内のパッケージのフォルダーにコピーするには、 include_package_data = True
を< code> setup()関数。詳細については、非コードファイルの追加をご覧ください。
他のヒント
あなたが説明していることを達成するには、2つのステップが必要です...
- ファイルをソース tarball に追加する必要があります
- データ ファイルをソース パスにインストールするには、setup.py を変更する必要があります
ステップ1:ファイルをソース tarball に追加するには、それを MANIFEST に含めます。
を作成します マニフェスト setup.pyを含むフォルダー内のテンプレート
MANIFEST は基本的に、ソース tarball に含まれるすべてのファイルのリストを含むテキスト ファイルです。
私のプロジェクトのマニフェストは次のようになります。
- 変更履歴.txt
- インストール.txt
- ライセンス.txt
- pyプリプロセッサ.py
- README.txt
- setup.py
- テスト.py
- TODO.txt
注記:その間 sdist する いくつかのファイルを自動的に追加する, 、何が行われ、何が行われないかを予測するのではなく、確実にそれらを明示的に指定することを好みます。
ステップ2:データ ファイルをソース フォルダーにインストールするには、setup.py を変更します。
データ ファイル (LICENSE.txt) をソース インストール フォルダーに追加しようとしているため、ソース インストール パスと一致するようにデータ インストール パスを変更する必要があります。これが必要なのは、デフォルトではデータ ファイルがソース ファイルとは異なる場所にインストールされるためです。
データ インストール ディレクトリをソース インストール ディレクトリと一致するように変更するには...
次のコマンドを使用して、distutils からインストール ディレクトリ情報を取得します。
from distutils.command.install import INSTALL_SCHEMES
データ インストール ディレクトリをソース インストール ディレクトリと一致するように変更します。
for scheme in INSTALL_SCHEMES.values():
scheme['data'] = scheme['purelib']
そして、データ ファイルと場所を setup() に追加します。
data_files=[('', ['LICENSE.txt'])]
注記:上記の手順は、拡張ライブラリを必要とせずに、標準的な方法で説明したことを正確に実行する必要があります。
必要なディレクトリへの recursive-include
またはファイル名付きの include
を使用して、プロジェクトルートに MANIFEST.in
を作成します。
include LICENSE
include README.rst
recursive-include package/static *
recursive-include package/templates *
setup.pyのsetup(:
setup(
name = 'foo library'
...
package_data={
'foolibrary.folderA': ['*'], # All files from folder A
'foolibrary.folderB': ['*.txt'] #All text files from folder B
},
これは私のために働いたより簡単な答えです。
まず、上記のPython Devのコメントによると、setuptoolsは必要ありません:
package_data is also available to pure distutils setup scripts
since 2.3. – Éric Araujo
これは、パッケージにsetuptoolsの要件を設定すると、インストールも必要になるため、素晴らしいことです。要するに:
from distutils.core import setup
setup(
# ...snip...
packages = ['pkgname'],
package_data = {'pkgname': ['license.txt']},
)
ステップ1:setup.pyと同じフォルダーに MANIFEST.in
ファイルを作成します
手順2:追加するファイルへの相対パスを MANIFEST.in
include README.rst
include docs/*.txt
include funniest/data.json
ステップ3:これらのファイルをサイトパッケージにコピーするには、 setup()
関数で include_package_data = True
を設定します
Centos 6でPython 2.7を使用して作業したことをフォローアップしたかっただけです。上記のpackage_dataまたはdata_filesを追加しても機能しませんでした。 python以外のファイルをtarballに入れたいファイルを含むMANIFEST.INを追加しましたが、RPMを介してターゲットマシンにインストールしませんでした。
最終的に、&quot; options&quot;を使用して、ファイルをソリューションに取り込むことができました。 setup / setuptoolsで。オプションファイルを使用すると、setup.pyからspecファイルのさまざまなセクションを変更できます。次のように。
from setuptools import setup
setup(
name='theProjectName',
version='1',
packages=['thePackage'],
url='',
license='',
author='me',
author_email='me@email.com',
description='',
options={'bdist_rpm': {'install_script': 'filewithinstallcommands'}},
)
ファイル-MANIFEST.in:
include license.txt
file-filewithinstallcommands:
mkdir -p $RPM_BUILD_ROOT/pathtoinstall/
#this line installs your python files
python setup.py install -O1 --root=$RPM_BUILD_ROOT --record=INSTALLED_FILES
#install license.txt into /pathtoinstall folder
install -m 700 license.txt $RPM_BUILD_ROOT/pathtoinstall/
echo /pathtoinstall/license.txt >> INSTALLED_FILES
質問の1つにコメントを投稿したかったのですが、それを行うには評判が足りません&gt;。&gt;
これは私にとってうまくいったものです(ドキュメントを参照してから思いつきました):
package_data={
'mypkg': ['../*.txt']
},
include_package_data: False
最後の行は、奇妙なことに、私にとっても重要でした(このキーワード引数を省略することもできます-同じように機能します)。
これは、最上位またはルートディレクトリ(配布するパッケージ mypkg
から1レベル上)にあるすべてのテキストファイルをコピーします。
これがお役に立てば幸いです!
回避策を見つけました: lgpl2.1_license.txt
の名前を lgpl2.1_license.txt.py
に変更し、テキストを三重引用符で囲みました。これで、 data_files
オプションを使用したり、絶対パスを指定したりする必要がなくなりました。 Pythonモジュールにするのは見苦しいですが、絶対パスを指定するよりも見苦しいとは思いません。