Python modülü dağılımında bir dosyayı bulma

oy
20

Ben daha zaman alıcı hesaplamaların biri için önceden hesaplanmış değerlerin bir bsddb veritabanını içeren bir Python paketi yazdım. Kolaylık olması açısından, benim kurulum komut dosyası (Unix üzerinde, /usr/lib/python2.5/site-packages/mypackage/ gibi bir şey) veritabanına erişir koduyla aynı dizinde veritabanı dosyasını yükler.

Benim kod erişebilmek nasıl veritabanı dosyasının son konumunu muhafaza ederim? Şu anda, dayalı yazarlardan kullanıyorum __file__veritabanına erişir modülünde değişken:

dbname = os.path.join (os.path.dirname (__ FILE__), database.dat)

O çalışır, ancak hackish ... görünüyor. Bunu yapmak için daha iyi bir yolu var mı? Sadece veritabanına erişen kodunun yanına yüklü alır bir dbconfig.py dosyası içine distutils modülü ve malzeme bunu nihai montaj yeri kapmak kurulum komut dosyası olsun isterim.

Oluştur 02/09/2008 saat 08:40
kaynak kullanıcı
Diğer dillerde...                            


4 cevaplar

oy
4

Yani, ait oldukları dosyaları yüklemek için Setuptools'u kullanmak gibi daha gelişmiş bir şeye başvurmadan, muhtemelen bunu yapmanın yolu bu.

Bir sorun gerçek bir güvenlik çerçevesi (Unixler vs.) komut dosyası çalıştıran kullanıcı yüklü olur sistem dizininde DB erişme haklarına sahip olmayabilir ile işletim sisteminde, bu yaklaşımla var dikkat edin.

Cevap 02/09/2008 saat 10:43
kaynak kullanıcı

oy
25

(Şu anda erişimi olan piton tümü üzerinde ve mevcut) setuptools parçası olan pkg_resources kullanmayı deneyin:

>>> 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'

Kaynakları almak için pkg_resources kullanma konusunda daha fazla tartışma var yumurta sayfa ve pkg_resources sayfa.

o paket bir yumurta parçası ise, resource_filename geçici dizine kopyalar çünkü pkg_resources.resource_stream veya pkg_resources.resource_string kullanmak muhtemelen tavsiye edilir mümkünse Ayrıca unutmayınız.

Cevap 02/09/2008 saat 13:26
kaynak kullanıcı

oy
11

Kullanın pkgutil.get_data. Bu kuzeni var pkg_resources.resource_stream, ancak standart kütüphanesinde ve düz dosya sistemi yükler yanı sıra sıkıştırılmış paketleri ve diğer ithalatçılar ile çalışmalıdır.

Cevap 29/03/2012 saat 01:52
kaynak kullanıcı

oy
0

Standart Python 3.7 kütüphanenin kullanın importlib.resourcesmodülü olan, daha verimli daha setuptools:pkg_resources (önceki Python sürümlerinde, backported kullanmak importlib_resourceskütüphane ).

Dikkat: Bunun işe yaraması için, klasör veri dosyası bulunduğu yerde düzenli bir piton-paket olmalıdır . Yani bir eklemelisiniz anlamına __init__.pydeğilse zaten orada, içine dosyayı.

Sonra böyle erişebilirsiniz:

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:
    ...
Cevap 22/06/2019 saat 11:51
kaynak kullanıcı

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