2009-06-18 9 views
12

Bir paketin dizinine nispeten nispeten nasıl başvuruda bulunabilirim?Python paketlerindeki göreli dosya yolları

Benim dizin yapısı şöyledir:

 
    /foo 
    package1/ 
     resources/ 
     __init__.py 
    package2/ 
     resources/ 
     __init__.py 
    script.py 

script.py ithalat paketleri package1 ve package2. Paketler sistemdeki başka bir komut dosyası tarafından alınabilse de. os.path.curdir'un keyfi olması durumunda çalışacağından emin olmak için kaynaklara nasıl başvurmalıyım, package1?

cevap

14

foo/package1/resources klasöründen dosyalara başvurmak isterseniz, modülün __file__ değişkenini kullanmak isteyebilirsiniz. foo/package1/__init__.py İçinde:

from os import path 
resources_dir = path.join(path.dirname(__file__), 'resources') 
+0

Başka bir yanıtta belirtildiği gibi, uygulamanız bir zip dosyasında paketlendiyse bu çalışmaz. – Glyph

0

paketiniz fermuarını yumurta gibi yüklenmişse, o zaman kaynakları kullanılamaz olabilir, çünkü bu, kötü bir fikirdir.

Kurulum teknesini kullanırsanız, zip_safe = false setup.py config dosyasına eklemeyi unutmayın.

+3

Bu doğrudur, ancak bir cevaptan ziyade bir yorumda olmalıydı, çünkü bu soruya cevap vermiyor. – Glyph

4

twisted.python.modules'u kullanırsanız, zip güvenli olabilir ve aynı zamanda kullanışlı bir API kullanabilirsiniz. Örneğin

, bazı İçinde metin ve bir data.txt ve bir dizinde bu sample.py varsa:

from twisted.python.modules import getModule 
moduleDirectory = getModule(__name__).filePath.parent() 
print repr(moduleDirectory.child("data.txt").open().read()) 

sonra sample ithal yapacak:

sizin modül
>>> import sample 
'Hello, data!\n' 
>>> 

ise Düzenli bir dizinde, getModule(__name__).filePath, bir FilePath; bir zip dosyasındaysa, aynı API'ların çoğunu destekleyen ancak tümünü desteklemeyen bir ZipPath olacaktır.

4

(setuptools ile dağıtılmaktadır) pkg_resources den resource_filename yöntemi şöyle kullanıyor Bunu yapmanın basit/güvenli yolu: Eğer package1/___init___.py içinde bu uygulamaya eğer

from pkg_resources import resource_filename 
filepath = resource_filename('package1', 'resources/thefile') 

Veya:

from pkg_resources import resource_filename 
filepath = resource_filename(__name__, 'resources/thefile') 

Bu, size (yanlış değilse) güvenli bir çözüm sağlar.