setup.py
コードの一部ではないファイルをインクルードするにはどうすればよいですか? (具体的には、これはライセンス ファイルですが、他のものでもかまいません。)
ファイルの場所を制御できるようにしたい。元のソース フォルダーでは、ファイルはパッケージのルートにあります。(つまり、最上位の と同じレベル__init__.py
です。) オペレーティング システムに関係なく、パッケージがインストールされたときに正確にそこにとどまることを望みます。それ、どうやったら出来るの?
おそらくこれを行う最善の方法は、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_data
dict
パッケージ名 (空 = すべてのパッケージ) からパターンのリスト (グロブを含めることができます) です。たとえば、パッケージ内のファイルのみを指定する場合は、それも実行できます。
package_data={'yourpackage': ['*.txt', 'path/to/resources/*.txt']}
ここでの解決策は、非ファイルの名前に拡張子を付けないことです。py
.py
詳細については、 Ian Bicking のプレゼンテーションを参照してください。
ソース配布 ( ) の内容を制御したいだけsdist
で、パッケージの外部 (最上位ディレクトリなど) にファイルがある場合に有効なもう 1 つの方法は、MANIFEST.in
ファイルを追加することです。このファイルの形式については、Python のドキュメントを参照してください。
この回答を書いてから、ソース配布物 ( ) に必要なファイルがあるMANIFEST.in
ことを確認するためだけに使用する方が、通常はストレスの少ないアプローチであることがわかりました。tar.gz
たとえば、requirements.txt
最上位の from を含めたい場合は、最上位の「data」ディレクトリを再帰的に含めます。
include requirements.txt
recursive-include data *
ただし、これらのファイルをインストール時に site-packages 内のパッケージのフォルダーにコピーするにinclude_package_data=True
は、setup()
関数に指定する必要があります。詳細については、非コード ファイルの追加を参照してください。
あなたが説明していることを達成するには、2つのステップが必要です...
ステップ 1: ファイルをソース tarball に追加するには、MANIFEST に含めます。
setup.py を含むフォルダーにMANIFESTテンプレートを作成します。
MANIFEST は基本的に、ソース tarball に含まれるすべてのファイルのリストを含むテキスト ファイルです。
私のプロジェクトのマニフェストは次のようになります。
注: sdistはいくつかのファイルを自動的に追加しますが、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'])]
注: 上記の手順は、拡張ライブラリを必要とせずに、標準的な方法で説明したことを正確に達成する必要があります。
setup( の下の setup.py で:
setup(
name = 'foo library'
...
package_data={
'foolibrary.folderA': ['*'], # All files from folder A
'foolibrary.folderB': ['*.txt'] #All text files from folder B
},
Centos 6 で Python 2.7 を使用しているときに見つけたものをフォローアップしたかっただけです。上記のように package_data または data_files を追加してもうまくいきませんでした。必要なファイルを含む MANIFEST.IN を追加して、Python 以外のファイルを tarball に入れましたが、RPM 経由でターゲット マシンにインストールしませんでした。
最終的に、setup/setuptools の「オプション」を使用して、ファイルをソリューションに組み込むことができました。オプション ファイルを使用すると、setup.py からスペック ファイルのさまざまなセクションを変更できます。次のように。
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
ファイル - インストールコマンドを含むファイル:
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
回避策を見つけました: 名前を my に変更lgpl2.1_license.txt
しlgpl2.1_license.txt.py
、テキストを三重引用符で囲みました。data_files
これで、オプションを使用したり、絶対パスを指定したりする必要がなくなりました。Pythonモジュールにするのは醜いことは知っていますが、絶対パスを指定するよりも醜くないと思います。