[解決済み] setuptools: パッケージデータのフォルダの場所
質問
私はpythonパッケージを配布するためにsetuptoolsを使用しています。今、私は追加のデータファイルを配布する必要があります。
setuptoolsのドキュメントから私が収集したところでは、私はパッケージディレクトリの中に私のデータファイルを持っている必要があります。しかし、私はむしろルートディレクトリのサブディレクトリの中に私のデータファイルを持つことを望みます。
私が避けたいと思うこと。
/ #root
|- src/
| |- mypackage/
| | |- data/
| | | |- resource1
| | | |- [...]
| | |- __init__.py
| | |- [...]
|- setup.py
代わりに欲しいもの
/ #root
|- data/
| |- resource1
| |- [...]
|- src/
| |- mypackage/
| | |- __init__.py
| | |- [...]
|- setup.py
必須でないなら、これほど多くのサブディレクトリを持つことに違和感を覚えます。なぜパッケージディレクトリの中にファイルを置かなければならないのか、その理由を見つけることができません。また、IMHOでは、これほど多くのネストされたサブディレクトリで作業するのは面倒だと思います。あるいは、この制限を正当化するような良い理由があるのでしょうか?
どのように解決するのですか?
オプション1:パッケージデータとしてインストールする
データファイルをPythonパッケージのルート内に配置する主な利点は、ファイルがユーザーのOSのどこに置かれるかを気にする必要がないことです。
データファイルをPythonパッケージのルート内に配置する主な利点は、ファイルがユーザーのシステムのどこに置かれるかを気にする必要がなくなることです。
Windows、Mac、Linux、モバイル プラットフォーム、または Egg の内部などです。あなたは
ディレクトリを見つけることができます。
data
ディレクトリを見つけることができます。
例えば、このようなプロジェクトのレイアウトがあった場合。
project/
foo/
__init__.py
data/
resource1/
foo.txt
に関数を追加することができます。
__init__.py
を追加して、データへの絶対パスを見つけることができます。
に追加することができます。
import os
_ROOT = os.path.abspath(os.path.dirname(__file__))
def get_data(path):
return os.path.join(_ROOT, 'data', path)
print get_data('resource1/foo.txt')
出力します。
/Users/pat/project/foo/data/resource1/foo.txt
プロジェクトがEggとしてインストールされた後、パスが
data
のパスが変更されますが、コードは変更する必要はありません。
/Users/pat/virtenv/foo/lib/python2.6/site-packages/foo-0.0.0-py2.6.egg/foo/data/resource1/foo.txt
オプション2:固定の場所にインストールする
代替案としては、Pythonパッケージの外側にデータを配置し、その後 のどちらかです。
-
の場所を
data
は設定ファイル経由で渡される。 コマンドライン引数、または - Pythonのコードに場所を埋め込む。
これは、あなたのプロジェクトを配布する予定がある場合には、はるかに望ましくないことです。 もしあなたが
本当に
を行いたいのであれば、あなたの
data
をターゲットシステム上の好きな場所にインストールすることができます。
from setuptools import setup
setup(
...
data_files=[
('/var/data1', ['data/foo.txt']),
('/var/data2', ['data/bar.txt'])
]
)
更新 : Pythonファイルを再帰的にgrepするシェル関数の例です。
atlas% function grep_py { find . -name '*.py' -exec grep -Hn $* {} \; }
atlas% grep_py ": \["
./setup.py:9: package_data={'foo': ['data/resource1/foo.txt']}
関連
-
[解決済み] Pythonでファイルやフォルダを削除する方法は?
-
[解決済み] pipで特定のバージョンのパッケージをインストールする
-
[解決済み] Pythonのsite-packagesディレクトリの場所を見つけるにはどうしたらいいですか?
-
[解決済み] distribute, distutils, setuptools, distutils2 の違い?
-
[解決済み】なぜPythonはこのJSONデータをパースできないのですか?[終了] PythonがこのJSONデータをパースできないのはなぜですか?
-
[解決済み] PythonでSVGからPNGに変換する
-
[解決済み] PyMongoで.sortを使用する
-
[解決済み] オブジェクトのリストに特定の属性値を持つオブジェクトが含まれているかどうかをチェックする
-
[解決済み] サブフォルダからのインポートモジュール
-
[解決済み] pipの依存性/必要条件をリストアップする方法はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] SQLAlchemy: セッションの作成と再利用
-
[解決済み] Pythonのインスタンス変数とクラス変数
-
[解決済み] Pandasの'Freq'タグにはどのような値が有効ですか?
-
[解決済み] DataFrameに日付間の日数カラムを追加する pandas
-
[解決済み] 値で列挙名を取得する [重複]。
-
[解決済み] オブジェクトのリストに特定の属性値を持つオブジェクトが含まれているかどうかをチェックする
-
[解決済み] サブフォルダからのインポートモジュール
-
[解決済み] Jupyter (IPython)ノートブックのセッションをpickleして保存する方法
-
[解決済み] PythonのRequestsモジュールを使ってWebサイトに "ログイン "するには?
-
[解決済み] 認証プラグイン 'caching_sha2_password' はサポートされていません。