2017-08-21 5 views
0

Ich möchte eine Ressourcendatei (die eigentlich von Scripten, aber nicht von Python selbst geteilt wird) in meiner PYTHONPATH behalten, damit sie von Modulen verwendet werden kann, die sich in diesem Pfad befinden und wiederum von verschiedenen Endskripten aufgerufen werden. Apps.Kann ich die Ressourcendatei in PYTHONPATH finden?

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

Gibt es eine Möglichkeit ich einfach eine Ressource (Resource.res) Datei verweisen kann, die zusammen mit tatsächlichen Python-Modulen unter der PYTHONPATH Hierarchie befinden, die gemeinsam genutzt werden, ohne auf die Datei den vollständigen Pfad liefert? Es gibt eine äquivalente Methode, um eine Ressourcendatei aus dem Java-Klassenpfad zu erhalten. Dort bekomme ich die Idee.

Der Inhalt der Ressourcendatei irrelevant sein sollte, aber nur um ihrer selbst willen Illustration, es könnte alles nicht-pythonic, wie statistische Daten, Konfiguration usw.

Antwort

1

Es ist trivial, eine Funktion zu schreiben, das dies tut:

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 

Diese Version liefert None, wenn die Datei nicht auf dem Pfad gefunden werden kann. Sie könnten auch eine Ausnahme auslösen.

+0

OP speziell auf benutze PYTHONPATH, was nicht dasselbe ist wie sys, path. Es ist verfügbar durch 'os.getenv ('PYTHONPATH')', wenn er also Ihren sys ersetzt, sollte Pfad mit diesem Funktionsaufruf funktionieren. –

+0

Dies funktioniert nicht, wenn das Paket, das die Ressource enthält, aus einer Zip-Datei geladen wird. –

+0

@Paul: Nicht ganz, da 'sys.path' eine Liste ist und' os.getenv ('PYTHONPATH') 'gibt eine Zeichenkette zurück. – martineau

0

Sie beliebige Dateien aus einem Paket lesen können pkgutil.get_data https://docs.python.org/3/library/pkgutil.html#pkgutil.get_data

Zum Beispiel mit einem GIF-Symbol von Ihrem Paket zu laden:

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

Sie können das Paket Argument variieren Dinge aus verschiedenen laden setzt. Wenn Sie in Ordnung eine aktuelle setuptools installieren Sie ihre Version davon verwenden könnte, die ein paar mehr Möglichkeiten http://setuptools.readthedocs.io/en/latest/pkg_resources.html#basic-resource-access

Diese arbeiten unabhängig, wie das Paket (separate Dateien auf dem Dateisystem oder als installiert liefert . zip/Ei/was auch immer

1

Dies ist sehr ähnlich zu @ Kindall Antwort, sondern verwendet die PYTHONPATH Umgebungsvariable statt sys.path die Verzeichnis-Suchliste, um zu bestimmen: gefragt

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