2017-08-21 12 views
0

私はPYTHONPATHにリソースファイル(実際にはスクリプト間で共有されているものは何でも共通ですが、Python自体ではありません)を保持したいのですが、そのパスにあるモジュールが別の終了スクリプト/アプリ。PYTHONPATHにリソースファイルがありますか?

PYTHONPATH 
    | 
    |--Module1.py 
    |--Module2.py 
    |--Resource.res 

Iが容易ファイルのフルパスを供給することなく、共有される実際のPythonモジュールと共にPYTHONPATH階層下に配置されているリソース(Resource.res)ファイルを参照することができる方法はありますか? Javaのクラスパスからリソースファイルを取得するのと同じ方法があります。これが私の考えを得ています。など、ランダムなデータ、設定、など

リソースファイルの内容は無関係でなければなりませんが、ただ、説明のために、それは非ニシキヘビ何もすることができ、

答えて

1

これを行う関数を記述するために些細です:

import sys, os.path 

def resolve(filename): 
    for directory in sys.path: 
     path = os.path.join(directory, filename) 
     if os.path.isfile(path): 
      return path 

このバージョンでは、ファイルがパスに見つからない場合はNoneを返します。例外を発生させることもできます。

+0

OPはに特異的に尋ねましたsys、pathと同じではないPYTHONPATHを使用してください。これは 'os.getenv( 'PYTHONPATH')'によって利用可能です。したがって、彼があなたのsysをその関数呼び出しで置き換えるなら、それはうまくいくはずです。 –

+0

リソースを含むパッケージがzipファイルからロードされている場合、これは機能しません。 –

+0

@Paul: 'sys.path'はリストで、' os.getenv( 'PYTHONPATH') 'は文字列を返します。 – martineau

0

あなたはあなたのパッケージからGIFアイコンをロードするために、例えばpkgutil.get_data https://docs.python.org/3/library/pkgutil.html#pkgutil.get_data

を使用してパッケージから任意のファイルを読むことができます:

image = pkgutil.get_data(__name__, "icon.gif") 

あなたが異なるから物事をロードするために、パッケージの引数を変更することができます場所。 あなたは、パッケージがインストールされている方法に関係なく、いくつかのより多くの可能性 http://setuptools.readthedocs.io/en/latest/pkg_resources.html#basic-resource-access

これらの作品(別のファイルシステム上のファイル、またはなどを提供し、それが彼らのバージョンを、使用することができsetuptools最近のインストール大丈夫だ場合。郵便番号/卵/何でも

1

これは、@ Kindall氏の答えに非常に似ていますが、ディレクトリ検索リストを決定する代わりにsys.pathPYTHONPATH環境変数を使用しています。

import os 
import sys 

def resource_file_path(filename): 
    """ Search for filename in the list of directories specified in the 
     PYTHONPATH environment variable. 
    """ 
    pythonpath = os.environ.get("PYTHONPATH") 
    if pythonpath: 
     for d in pythonpath.split(os.pathsep): 
      filepath = os.path.join(d, filename) 
      if os.path.isfile(filepath): 
       return filepath 
    return None 
関連する問題