Estamos trabalhando com um repositório de código implantado no Windows e Linux - às vezes em diretórios diferentes. Como um dos módulos dentro do projeto se refere a um dos recursos não-Python do projeto (arquivos CSV, etc.)?
Se fizermos algo como:
thefile=open('test.csv')
ou:
thefile=open('../somedirectory/test.csv')
Ele funcionará apenas quando o script for executado em um diretório específico ou em um subconjunto dos diretórios.
O que eu gostaria de fazer é algo como:
path=getBasePathOfProject()+'/somedirectory/test.csv'
thefile=open(path)
É possível?
python
path
relative-path
olamundo
fonte
fonte
__file__
), '.. '' ..', 'recursos')os.pardir
é um pouco melhor que'..'
, embora os dois sejam equivalentes no POSIX e no Windows.Se você estiver usando ferramentas de configuração ou distribuir (uma instalação setup.py), a maneira "correta" de acessar esses recursos empacotados parece estar usando package_resources.
No seu caso, o exemplo seria
O que, é claro, lê o recurso e os dados binários lidos seriam o valor de my_data
Se você só precisa do nome do arquivo, também pode usar
Exemplo:
A vantagem é que é garantido que funcione, mesmo que seja uma distribuição de arquivos como um ovo.
Consulte http://packages.python.org/distribute/pkg_resources.html#resourcemanager-api
fonte
__file__
como nos bons velhos tempos?No Python, os caminhos são relativos ao diretório de trabalho atual , que na maioria dos casos é o diretório no qual você executa seu programa. O diretório de trabalho atual provavelmente não é o mesmo que o diretório do arquivo de módulo, portanto, usar um caminho relativo ao arquivo de módulo atual é sempre uma má escolha.
Usar caminho absoluto deve ser a melhor solução:
fonte
Costumo usar algo semelhante a este:
A variável
mantém o nome do arquivo do script no qual você escreve esse código, para que você possa criar caminhos em relação ao script, mas ainda gravados com caminhos absolutos. Funciona muito bem por vários motivos:
Mas você precisa observar a compatibilidade da plataforma - o os.pathsep do Windows é diferente do UNIX.
fonte
Você também tenta normalizar seu
cwd
usoos.path.abspath(os.getcwd())
. Mais informações aqui .fonte
cwd
é o caminho de um módulo, emboraVocê pode usar a compilação na
__file__
variável Ele contém o caminho do arquivo atual. Eu implementaria getBaseOfProject em um módulo na raiz do seu projeto. Lá eu pegaria o caminho__file__
e o retornaria. Esse método pode ser usado em qualquer lugar do seu projeto.fonte
Fiquei perplexo aqui um pouco. Queria empacotar alguns arquivos de recursos em um arquivo wheel e acessá-los. Fiz a embalagem usando o arquivo manifest, mas a instalação do pip não a instalava, a menos que fosse um subdiretório. Esperando que essas cenas ajudem
MANIFEST.in
Criou um weel usando o setup.py padrão. O pip instalou o arquivo da roda. Após a instalação, verifique se os recursos estão instalados. Eles são
Em tfclient.py para acessar esses arquivos. de
E isso funciona.
fonte
Passei muito tempo tentando descobrir a resposta para isso, mas finalmente consegui (e é realmente muito simples):
Isso anexará o caminho relativo da sua subpasta aos diretórios para o python procurar. É bem rápido e sujo, mas funciona como um encanto :)
fonte
open('your/subfolder/of/choice')
qualquer maneira.