Encontrar um arquivo em uma distribuição módulo Python

votos
20

Eu escrevi um pacote Python que inclui um banco de dados bsddb de valores pré-calculados para uma das mais cálculos demorados. Para simplificar, o meu script de instalação instala o arquivo de banco de dados no mesmo diretório que o código que acessa o banco de dados (em Unix, algo como /usr/lib/python2.5/site-packages/mypackage/).

Como faço para armazenar a localização final do arquivo de banco de dados para o meu código pode acessá-lo? Agora, eu estou usando um truque com base na __file__variável no módulo que acessa o banco de dados:

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

Ele funciona, mas parece ... hackish. Existe uma maneira melhor de fazer isso? Eu gostaria de ter o script de instalação basta pegar o local final de instalação do módulo distutils e enchê-lo em um arquivo dbconfig.py que é instalado juntamente com o código que acessa o banco de dados.

Publicado 02/09/2008 em 10:40
fonte usuário
Em outras línguas...                            


4 respostas

votos
25

Tente usar pkg_resources, que faz parte do setuptools (e disponível em todos os pítons Eu tenho acesso a agora):

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

Não há mais discussão sobre o uso de pkg_resources para obter recursos na ovos página eo pkg_resources página.

Observe também, sempre que possível é provavelmente aconselhável usar pkg_resources.resource_stream ou pkg_resources.resource_string porque se o pacote é parte de um ovo, resource_filename irá copiar o arquivo para um diretório temporário.

Respondeu 02/09/2008 em 15:26
fonte usuário

votos
11

Use pkgutil.get_data. É o primo de pkg_resources.resource_stream, mas na biblioteca padrão, e deve funcionar com sistema de arquivos plana instala, bem como pacotes de comprimidos e outros importadores.

Respondeu 29/03/2012 em 03:52
fonte usuário

votos
4

Isso é provavelmente a maneira de fazê-lo, sem recorrer a algo mais avançado, como usando setuptools para instalar os arquivos onde eles pertencem.

Observe que há um problema com essa abordagem, porque em sistemas operacionais com um quadro verdadeiro de segurança (UNIXes, etc.) o usuário que executa o script pode não ter os direitos para acessar o DB no diretório do sistema onde fica instalado.

Respondeu 02/09/2008 em 12:43
fonte usuário

votos
0

Use o padrão da biblioteca Python-3.7 importlib.resourcesmódulo , que é mais eficiente do que setuptools:pkg_resources (em versões de Python anteriores, use o backported importlib_resourcesbiblioteca ).

Atenção: Para que isso funcione, a pasta onde reside o-arquivo de dados deve ser um python-package regulares . Isso significa que você deve adicionar um __init__.pyarquivo nele, se já não estiver lá.

Depois, você pode acessá-lo assim:

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:
    ...
Respondeu 22/06/2019 em 12:51
fonte usuário

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