質問

どうやって作るの? 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モジュールにするのは見苦しいですが、絶対パスを指定するよりも見苦しいとは思いません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top