web-dev-qa-db-ja.com

setup.pyで非Pythonファイルを含める

setup.pyにコードの一部ではないファイルを含めるにはどうすればよいですか? (具体的には、これはライセンスファイルですが、他のものでもかまいません。)

ファイルの場所を制御できるようにしたい。元のソースフォルダーでは、ファイルはパッケージのルートにあります。 (つまり、最上位の__init__.pyと同じレベルにあります。)オペレーティングシステムに関係なく、パッケージがインストールされたときに正確にそこに留まるようにします。それ、どうやったら出来るの?

167
Ram Rachum

おそらくこれを行う最良の方法は、setuptoolspackage_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は、パッケージ名(空=すべてのパッケージ)からパターンのリスト(globを含めることができる)へのdictです。たとえば、パッケージ内のファイルのみを指定する場合は、それも実行できます。

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

ここでの解決策は、.py拡張子を使用して非pyファイルの名前を変更することですnot

詳細については、 Ian Bickingのプレゼンテーション を参照してください。

更新:別の[より良い]アプローチ

ソースディストリビューション(sdist)のコンテンツを制御し、パッケージの外部にファイル(トップレベルディレクトリなど)を持ちたい場合にうまく機能する別のアプローチは、MANIFEST.inファイルを追加することです。このファイルの形式については Python documentation をご覧ください。

この応答を書いて以来、MANIFEST.inを使用することは、ソースディストリビューション(tar.gz)に必要なファイルがあることを確認するために、通常はそれほどイライラしないアプローチであることがわかりました。

たとえば、トップレベルのrequirements.txtを含めたい場合、トップレベルの「データ」ディレクトリを再帰的に含めます。

include requirements.txt
recursive-include data *

それでも、インストール時にこれらのファイルをサイトパッケージ内のパッケージのフォルダーにコピーするには、include_package_data=Truesetup()関数に指定する必要があります。詳細については、 非コードファイルの追加 を参照してください。

179
Hans L

あなたが説明していることを達成するには、2つのステップがかかります...

  • ファイルをソースtarballに追加する必要があります
  • データファイルをソースパスにインストールするには、setup.pyを変更する必要があります

ステップ1:ファイルをソースtarballに追加するには、それをMANIFESTに含めます

Setup.pyを含むフォルダーに MANIFEST テンプレートを作成します

MANIFESTは基本的に、ソースtarballに含まれるすべてのファイルのリストを含むテキストファイルです。

プロジェクトのマニフェストは次のようになります。

  • CHANGELOG.txt
  • INSTALL.txt
  • LICENSE.txt
  • pypreprocessor.py
  • README.txt
  • setup.py
  • test.py
  • TODO.txt

注: sdistdoesいくつかのファイルを自動的に追加します ですが、明示的に指定して、それが何をし、何をしないかを予測する代わりに、確かに。

ステップ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'])]

注:上記の手順は、拡張ライブラリを必要とせずに、標準の方法で説明した内容を正確に達成する必要があります。

43
Evan Plaice

プロジェクトルートにMANIFEST.inを作成し、recursive-includeを必要なディレクトリに作成するか、includeをファイル名で作成します。

include LICENSE
include README.rst
recursive-include package/static *
recursive-include package/templates *

ドキュメントはここにあります

12

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
   },
5

ステップ1:setup.pyで同じフォルダーにMANIFEST.inファイルを作成します

ステップ2:MANIFEST.inに追加するファイルへの相対パスを含めます

include README.rst
include docs/*.txt
include funniest/data.json

ステップ3:setup()関数にinclude_package_data=Trueを設定して、これらのファイルをサイトパッケージにコピーします

参照はこちら

4
debuglife

ここに私のために働いた簡単な答えがあります。

まず、上記の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']},
)
3
Gringo Suave

Centos 6でPython 2.7を使用して作業したことをフォローアップしたかっただけです。上記のpackage_dataまたはdata_filesを追加しても機能しませんでした。 python以外のファイルをtarballに入れたいファイルを含むMANIFEST.INを追加しましたが、RPMを介してターゲットマシンにインストールしませんでした。

最終的に、setup/setuptoolsの「オプション」を使用して、ファイルをソリューションに取り込むことができました。オプションファイルを使用すると、setup.pyからspecファイルのさまざまなセクションを変更できます。次のように。

from setuptools import setup


setup(
    name='theProjectName',
    version='1',
    packages=['thePackage'],
    url='',
    license='',
    author='me',
    author_email='[email protected]',
    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
Scott Bowers

質問の1つにコメントを投稿したかったのですが、それを行うのに十分な評判がありません。>

私にとってはうまくいったものがあります(ドキュメントを参照してから思いつきました):

package_data={
    'mypkg': ['../*.txt']
},

include_package_data: False

奇妙なことに、最後の行も私にとって重要でした(このキーワード引数も省略できます-同じように機能します)。

これにより、最上位またはルートディレクトリ(配布するパッケージmypkgから1レベル上)にあるすべてのテキストファイルがコピーされます。

お役に立てれば!

1
rv.kvetch