Setuptools/distributeを使用する場合、インストーラーに package_data
ファイルを取り込むことができません。私が読んだことはすべて、次のことが正しい方法であると言っています。誰かアドバイスをお願いできますか?
setup(
name='myapp',
packages=find_packages(),
package_data={
'myapp': ['data/*.txt'],
},
include_package_data=True,
Zip_safe=False,
install_requires=['distribute'],
)
ここで、myapp/data/
はデータファイルの場所です。
私はこれが古い質問であることを理解しています...しかし、Googleを介してここにある方法を見つける人々のために:package_data
はローダウン、 汚い嘘 です。 binaryパッケージ(python setup.py bdist ...
)をビルドする場合にのみ使用されますが、notの場合ソースパッケージのビルド(python setup.py sdist ...
)。もちろん、これはばかげています-ソースディストリビューションを構築すると、バイナリディストリビューションを構築するために他の誰かに送信される可能性のあるファイルのコレクションが生成されることが予想されます。
いずれにせよ、 MANIFEST.in
を使用すると、バイナリおよびソース配布でbothが機能します。
これと同じ問題がありました。解決策は、単にinclude_package_data=True
を削除することでした。
ここを読んで の後、include_package_data
がversion controlからのファイルを含むことを目的としていることを認識しました。ドキュメントから:
[include_package_data]のデータファイルは、CVSまたはSubversionの制御下にある必要があります
...
含まれるファイルをきめ細かく制御する場合(たとえば、パッケージディレクトリにドキュメントファイルがあり、インストールから除外する場合)、
package_data
キーワードを使用することもできます。
この引数を取り除いて修正したのは、それがdistutilsに切り替えたときにも機能した理由です。
include_package_data=True
行を削除するという@Joeの推奨事項にも従いました。
もう少し詳しく述べると、noMANIFEST.in
ファイルがあります。私はCVSではなくGitを使用しています。
リポジトリは次のような形を取ります。
/myrepo
- .git/
- setup.py
- myproject
- __init__.py
- some_mod
- __init__.py
- animals.py
- rocks.py
- config
- __init__.py
- settings.py
- other_settings.special
- cool.huh
- other_settings.xml
- words
- __init__.py
Word_set.txt
setup.py
:
from setuptools import setup, find_packages
import os.path
setup (
name='myproject',
version = "4.19",
packages = find_packages(),
# package_dir={'mypkg': 'src/mypkg'}, # didnt use this.
package_data = {
# If any package contains *.txt or *.rst files, include them:
'': ['*.txt', '*.xml', '*.special', '*.huh'],
},
#
# Oddly enough, include_package_data=True prevented package_data from working.
# include_package_data=True, # Commented out.
data_files=[
# ('bitmaps', ['bm/b1.gif', 'bm/b2.gif']),
('/opt/local/myproject/etc', ['myproject/config/settings.py', 'myproject/config/other_settings.special']),
('/opt/local/myproject/etc', [os.path.join('myproject/config', 'cool.huh')]),
#
('/opt/local/myproject/etc', [os.path.join('myproject/config', 'other_settings.xml')]),
('/opt/local/myproject/data', [os.path.join('myproject/words', 'Word_set.txt')]),
],
install_requires=[ 'jsonschema',
'logging', ],
entry_points = {
'console_scripts': [
# Blah...
], },
)
ソースdistribに対してpython setup.py sdist
を実行します(バイナリを試していません)。
そして、まったく新しい仮想環境内にいるとき、私はmyproject-4.19.tar.gz
、ファイルを持っているので、
(venv) pip install ~/myproject-4.19.tar.gz
...
そして、私の仮想環境のsite-packages
にインストールされるすべてのもの以外に、それらの特別なデータファイルは/opt/local/myproject/data
と/opt/local/myproject/etc
にインストールされます。
include_package_data=True
は私のために働いた。
Gitを使用する場合は、setuptools-git
にinstall_requires
を含めることを忘れないでください。 Manifest
を持つことやpackage_data
にすべてのパスを含めることより退屈ではありません(私の場合は、すべての種類の静的なDjangoアプリです)
( k3-rnc が実際に役立っていると述べたように、私が作成したコメントを貼り付けました)
Update:この回答は古く、情報は無効になっています。すべてのsetup.py構成では、import setuptools
を使用する必要があります。 https://stackoverflow.com/a/49501350/6431 でより完全な回答を追加しました
Distutilsに切り替えることでこれを解決しました。配布は非推奨または壊れているようです。
from distutils.core import setup
setup(
name='myapp',
packages=['myapp'],
package_data={
'myapp': ['data/*.txt'],
},
)
古代の質問とそれでも... pythonのパッケージ管理には本当に多くのことが望まれます。そのため、指定したディレクトリにローカルでpipを使用してインストールするユースケースがあり、package_dataとdata_filesの両方のパスが機能しなかったことに驚きました。リポジトリにさらに別のファイルを追加することに熱心ではなかったため、data_filesとsetup.pyオプション--install-dataを利用することになりました。このようなもの
pip install . --install-option="--install-data=$PWD/package" -t package
私はこの数日同じ問題を抱えていましたが、このスレッドでさえ明確にすることができませんでした。すべてが混乱しているだけです。だから私は私の研究を行い、解決策を見つけました。基本的にこの場合、これはあなたがすべきことです:
from setuptools import setup
setup(
name='myapp',
packages=['myapp'],
package_dir={'myapp':'myapp'}, # the one line where all the magic happens
package_data={
'myapp': ['data/*.txt'],
},
)
パッケージデータを含むフォルダーをモジュールフォルダーに移動すると、問題が解決しました。
この質問を参照してください: MANIFEST.inは「python setup.py install」では無視されます-データファイルがインストールされていませんか?