web-dev-qa-db-ja.com

Pythonパッケージング:データファイルはtar.gzファイルに適切に配置されますが、仮想環境にはインストールされません

仮想環境にプロジェクトpackage_fiddlerを適切にインストールできません。

MANIFEST.inは、Package_fiddler-0.0.0.tar.gzの実行時に生成される非.pyファイルをpython setup.py sdistに配置する責任があることを理解しました。

それから私はしました:

(virt_envir)$ pip install dist/Package_fiddler-0.0.0.tar.gz

しかし、これではデータファイルもパッケージも/home/username/.virtualenvs/virt_envir/local/lib/python2.7/site-packagesにインストールされませんでした。

セットアップ引数package_datainclude_package_datadata_filesの多くの構成を試しましたが、毎回間違った構成を使用したようです。

package_datainclude_package_datadata_filesのどちらの構成で仮想環境にpackage_fiddlerが正しくインストールされますか?

プロジェクトツリー

.
├── MANIFEST.in
├── package_fiddler
│   ├── data
│   │   ├── example.html
│   │   └── stylesheets
│   │       └── example.css
│   └── __init__.py
├── README.rst
└── setup.py

setup.py

from setuptools import setup


setup(
    name='Package_fiddler',
    entry_points={
    'console_scripts': ['package_fiddler = package_fiddler:main', ],},
    long_description=open('README.rst').read(),
    packages=['package_fiddler',])

MANIFEST.in

include README.rst
recursive-include package_fiddler/data *

Setup.py(上記のコードベースを使用)のどの設定を試しましたか?

構成1

追加:

package_data={"": ['package_fiddler/data/*',]}

構成2

追加:

package_data={"": ['*.html', '*.css', '*.rst']}

構成

追加:

include_package_data=True

構成4

追加:

package_data={"": ['package_fiddler/data',]}

削除:

packages=['package_fiddler',]

Configuration5(クリスの提案)

追加:

package_data={"data": ['package_fiddler/data',]}

削除:

packages=['package_fiddler',]

構成6

追加:

package_data={"": ['package_fiddler/data/*',]}

削除:

packages=['package_fiddler',]

これらの構成ではすべて、/home/username/.virtualenvs/virt_envir/local/lib/python2.7/site-packagesにファイルがインストールされません。

編集

Toshio Kuratomiへの注意:私の元の投稿では、わかりやすくするためにこの問題が発生する最も単純なツリー構造を使用しましたが、実際には私のツリーは以下のツリーに似ています。そのツリーでは、奇妙なことに、stylesheets__init__.pyのみを配置すると、textsフォルダー内のすべてのデータファイルも正しくインストールされます!!!これは私を困惑させます。

ツリー2(これにより、すべてのデータファイルが正しくインストールされます!!)

.
├── MANIFEST.in
├── package_fiddler
│   │── stylesheets
|   |     ├── __init__.py
|   |     ├── example.css  
|   |     └── other
|   |          └── example2.css
|   |__ texts
|   |     ├── example.txt  
|   |     └── other
|   |          └── example2.txt
│   └── __init__.py
├── README.rst
└── setup.py
43
Bentley4

Setuptoolsがコードとデータを概念的および実装的に混合する方法は個人的に嫌いです。ここであなたをつまずかせているのはその実装だと思います。 setuptoolsがpackage_dataを検索して使用するには、データがpythonパッケージ内に存在する必要があります。pythonパッケージはディレクトリでもかまいませんが、 __init__.pyディレクトリ内のファイル。したがって、次の(空でもかまいません)ファイルが必要なようです。

./package_fiddler/data/__init__.py
./package_fiddler/data/stylesheets/__init__.py
27
Toshio Kuratomi

私のために働いた解決策を見つけた here

setuptools==2.0.2の使用:

setuptools.setup(
    ...
    packages=setuptools.find_packages(),
    include_package_data=True,  # use MANIFEST.in during install
    ...
)
34
warvariuc

「setup.py」にパッケージデータを含める最も簡単な方法は次のとおりです。

_package_data = {'<package name>': ['<path to data file within package dir>']}
_

だからあなたの例では:

_package_data = {'package_fiddler': ['data/*', 'data/stylesheets/*']}
_

_package_data_は、キーがインストーラーに含まれるパッケージの名前である辞書です。これらのキーの下の値は、パッケージディレクトリ内の特定のファイルパスまたはグロブ/ワイルドカードのリストである必要があります。

また、フラグを含める必要があります。

_Zip_safe=False
_

データへのファイルシステムパスを解決できるようにする場合は、setup(...)内。それ以外の場合は、_pkg_resources_を使用してこれを行うことができます: http://peak.telecommunity.com/DevCenter/PythonEggs#accessing-package-resources

「data」ディレクトリに___init__.py_ファイルは必要ありません。このディレクトリはモジュールではなく、インポートするためのものではありません。

12
Leo