2017-07-10 9 views
0

Linuxマシンを対象としたPythonパッケージを使用して、ロケールファイルをアクセス可能な場所にインストールする必要があります。今、私はそれらをsys.prefix + "/share/locale/"にインストールしています。Pythonデータファイルをインストールしてから再度検索する

しかし、私はUbuntuとpipで小さな警告を見つけました。デフォルトでは、Ubuntuはインストールされているパッケージを/usr/localにインストールし、インストール時にはsys.prefixに設定します。ただし、インストール後にパッケージを実行すると、接頭辞は/usrになります。つまり、自分のコードが/usr/localにインストールされているロケールファイルを見つけることができません。

私は単に場所をハードコードすることができますが、パッケージの移植性が低く、ユーザーがルートとしてインストールする必要があるため、これをやめたくありません。これらはsetup.pyにdata_filesとして追加され、pythonパッケージとしては検出されません。

のインストール後にパッケージでロケールファイルを確実に見つける方法を教えてください。

インストール中にパッケージの__init__.pyに行を追加すると、ロケールディレクトリの場所を示す変数が作成されました。ただし、ソースファイルを変更せずにインストールされているファイルを編集するのは簡単ではありませんでした。

これはPython 3専用パッケージです。

+0

/usr/local/binに/ usr/binに2つのPythonが存在していませんか?私はPythonが 'sys.prefix'をそのように変更するとは思わない。しかし、2つの異なるPythonsは、2つの異なる接頭辞を持つことがあります。 – phd

+0

@phd 'find' echo $ PATH | tr ':' "" -name python3' ''は '/ usr/bin/python3'のみを表示します。これは、Ubuntuが/ usr/localに移動してプレフィックスを変更するためにpipでユーザがインストールしたファイルを必要としているためですが、メインマシンのファイルを変更する必要があるからです。 – DonyorM

答えて

1

resource functions available in pkg_resourcesを使用してファイルを検索している可能性がありますか?

from pkg_resources import resource_stream, resource_filename 
with resource_stream('my_package', 'locale/foo.dat') as infp: 
    # ... 
# ... or ... 
foo_location = resource_filename('my_package', 'locale/foo.dat') 
+0

これはどのように役立ちますかファイルのパスがわからない場合はどうすればいいですか?これらはデータファイルであり、パッケージに含まれません。 – DonyorM

+0

パッケージに必要なデータファイルの場合は、パッケージ階層内にある必要があります。 – AKX

+0

本当ですか?ロケールファイルは/ usr/share/locale(少なくともdebianの下で)の下に置かれるはずです。私はそれをパッケージ化することは適切ではないと思います。また、gettextを使って.moファイルに.poをコンパイルしていますので、パッケージデータとして追加するのはちょっと面倒ですが、可能であれば、私は可能です。 – DonyorM