Cercando di capire come si potrebbe combinare i due aspetti togather
- di carico per le risorse nel file system nativo
- Confezionato in file zippati
lettura attraverso il breve tutorial su zipimport: http://www.doughellmann.com/PyMOTW/zipimport/
Vedo il seguente esempio:
import sys
sys.path.insert(0, 'zipimport_example.zip')
import os
import zipimport
importer = zipimport.zipimporter('zipimport_example.zip')
module = importer.load_module('example_package')
print module.__file__
print module.__loader__.get_data('example_package/README.txt')
Penso che la produzione di __FILE__ è "zipimport_example.zip/example_package/__init__.pyc"
bisogno di verificare come appare da dentro.
Ma allora potremmo sempre fare qualcosa di simile:
if ".zip" in example_package.__file__:
...
load using get_data
else:
load by building the correct file path
[Edit:] Ho cercato di lavorare fuori l'esempio un po 'meglio.
Se il pacchetto viene importato come file zippato poi, due cose accadono
- __FILE__ contiene ".zip" nel suo percorso.
- __loader__ è disponibile nello spazio dei nomi
Se queste due condizioni sono soddisfatte, allora all'interno del pacchetto che si possa fare:
print __loader__.get_data(os.path.join('package_name','README.txt'))
altrimenti il modulo è stato caricato normalmente e si può seguire il metodo ordinario per caricare il file.
OK questa è una risposta pitoniosa. get_data sembra interessante, ma pkg_resources è un modo per intimidire, ma cercherò in modo esauriente di esaminarlo quando inizierò a usare distutils per impacchettare il mio progetto. –
Sto cercando una soluzione simile. 'get_data' è ottimo ma ho bisogno di ottenere l'oggetto simile a un file per questo file, non il contenuto del file direttamente. C'è un modo elegante? – zegkljan
@zegkljan Il modo più cortese è di avvolgerlo con BytesIO (StringIO in Py2): 'file_like = BytesIO (get_data (__ package__, 'filename.dat'))' – cincodenada