Finne en fil i et Python-modul distribusjon

stemmer
21

Jeg har skrevet en Python pakke som inkluderer en bsddb database med forhåndsberegnede verdier for en av de mer tidkrevende beregninger. For enkelhets skyld, installerer mitt oppsett script databasefilen i samme katalog som den kode som gir tilgang til databasen (på Unix, noe som /usr/lib/python2.5/site-packages/mypackage/).

Hvordan kan jeg lagre den endelige plasseringen av databasefilen gjøre det min kode får tilgang til den? Akkurat nå, jeg bruker en hack basert på __file__variable i modulen som har tilgang til databasen:

dbnavn = os.path.join (os.path.dirname (__ file__), database.dat)

Det fungerer, men det virker ... hackish. Finnes det en bedre måte å gjøre dette? Jeg vil gjerne ha oppsettet manuset bare ta den endelige installasjonsstedet fra distutils modul og greier det til en dbconfig.py filen som blir installert sammen med koden som har tilgang til databasen.

Publisert på 02/09/2008 klokken 09:40
kilden bruker
På andre språk...                            


4 svar

stemmer
25

Prøv å bruke pkg_resources, som er en del av setuptools (og tilgjengelig på alle de pytonslanger jeg har tilgang til akkurat nå):

>>> import pkg_resources
>>> pkg_resources.resource_ filename(__name__, "foo.config")
'foo.config'
>>> pkg_resources.resource_filename('tempfile', "foo.config")
'/usr/lib/python2.4/foo.config'

Det er mer diskusjon om bruk pkg_resources å få ressurser på egg side og pkg_resources siden.

Legg også merke til, der det er mulig det er nok lurt å bruke pkg_resources.resource_stream eller pkg_resources.resource_string fordi hvis pakken er en del av et egg, vil resource_filename kopiere filen til en midlertidig katalog.

Svarte 02/09/2008 kl. 14:26
kilden bruker

stemmer
11

Bruk pkgutil.get_data. Det er fetter av pkg_resources.resource_stream, men i standardbiblioteket, og skal jobbe med flat filsystem installasjoner samt zippet pakker og andre importører.

Svarte 29/03/2012 kl. 02:52
kilden bruker

stemmer
4

Det er nok måten å gjøre det, uten å ty til noe mer avansert som å bruke setuptools å installere filene der de hører hjemme.

Legg merke til det er et problem med denne tilnærmingen, fordi på operativsystemer med ekte et sikkerhetsrammeverk (UNIXer, etc.) brukeren kjører skriptet kanskje ikke har rettigheter til å få tilgang til DB i systemet katalogen der det blir installert.

Svarte 02/09/2008 kl. 11:43
kilden bruker

stemmer
0

Bruk standard Python-3,7 bibliotekets importlib.resourcesmodul , som er mer effektiv enn setuptools:pkg_resources (på tidligere Python versjoner, bruker backported importlib_resourcesbiblioteket ).

OBS: For at dette skal fungere, mappen hvor dataene-filen befinner seg må være en vanlig python-pakken . Det betyr at du må legge til en __init__.pyfil inn i det, hvis det ikke allerede er det.

Deretter kan du få tilgang til det slik:

try:
  import importlib.resources as importlib_resources
except ImportError:
  # In PY<3.7 fall-back to backported `importlib_resources`.
  import importlib_resources


## Note that the actual package could have been used, 
#  not just its (string) name, with something like: 
#      from XXX import YYY as data_pkg
data_pkg = '.'
fname = 'database.dat'

db_bytes = importlib_resources.read_binary(data_pkg, fname)
# or if a file-like stream is needed:
with importlib_resources.open_binary(data_pkg, fname) as db_file:
    ...
Svarte 22/06/2019 kl. 12:51
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more