252

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

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

4

14 に答える 14

275

おそらくこれを行う最善の方法は、setuptools package_dataディレクティブを使用することです。これはの代わりにsetuptools(または)を使用することを意味しますが、これは非常にシームレスな「アップグレード」です。distributedistutils

完全な (しかしテストされていない) 例を次に示します。

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

詳細については、 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()関数に指定する必要があります。詳細については、非コード ファイルの追加を参照してください。

于 2009-12-07T02:20:16.857 に答える
44

あなたが説明していることを達成するには、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

注: 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'])]

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

于 2010-06-15T04:00:06.853 に答える
5

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
   },
于 2014-12-27T04:49:53.780 に答える
2

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
于 2015-06-01T17:22:40.253 に答える
-13

回避策を見つけました: 名前を my に変更lgpl2.1_license.txtlgpl2.1_license.txt.py、テキストを三重引用符で囲みました。data_filesこれで、オプションを使用したり、絶対パスを指定したりする必要がなくなりました。Pythonモジュールにするのは醜いことは知っていますが、絶対パスを指定するよりも醜くないと思います。

于 2009-10-23T12:22:55.733 に答える