Estou criando um script auxiliar simples para o trabalho que copiará alguns arquivos de modelo em nossa base de código para o diretório atual. No entanto, não tenho o caminho absoluto para o diretório em que os modelos estão armazenados. Eu tenho um caminho relativo do script, mas quando eu chamo o script, ele trata isso como um caminho relativo ao diretório de trabalho atual. Existe uma maneira de especificar que esse URL relativo seja do local do script?
python
relative-path
path
baudtack
fonte
fonte
Respostas:
No arquivo que possui o script, você deseja fazer algo assim:
Isso fornecerá o caminho absoluto para o arquivo que você está procurando. Observe que, se você estiver usando o setuptools, provavelmente deverá usar a API de recursos do pacote .
ATUALIZAÇÃO : estou respondendo a um comentário aqui para colar um exemplo de código. :-)
Suponho que você queira dizer o
__main__
script quando menciona a execução direta do arquivo. Nesse caso, não parece ser o caso no meu sistema (python 2.5.1 no OS X 10.5.7):No entanto, eu sei que existem algumas peculiaridades
__file__
nas extensões C. Por exemplo, eu posso fazer isso no meu Mac:No entanto, isso gera uma exceção na minha máquina Windows.
fonte
filename = os.path.join(dir, 'relative', 'path', 'to', 'file', 'you' , 'want')
os.path.dirname(__file__)
pode dar uma cadeia vazia, usaros.path.dirname(os.path.abspath(__file__))
vezvocê precisa
os.path.realpath
(a amostra abaixo adiciona o diretório pai ao seu caminho)fonte
os.path.dirname(__file__)
me deu uma corda vazia. Isso funcionou perfeitamente.os.path.realpath('..')
fornece o diretório pai do diretório de trabalho atual . Isso geralmente não é o que você deseja.Como mencionado na resposta aceita
Eu só quero adicionar isso
Deve ser algo como
A resposta aceita pode ser enganosa em alguns casos, consulte este link para obter detalhes
fonte
os.path.join
é melhor porque ele os une ao separador específico do SO.'/relative/path...'
não é um caminho relativo. Isso é intencional?os.path.join()
. O que resta é a preferência de usar cadeias separadas para cada elemento do caminho em vez de codificar o separador de caminhos.Agora é 2018, e o Python já evoluiu
__future__
há muito tempo. Assim como sobre usando o incrívelpathlib
que vem com o Python 3.4 para realizar a tarefa em vez de lutar comos
,os.path
,glob
,shutil
, etc.Portanto, temos três caminhos aqui (possivelmente duplicados):
mod_path
: qual é o caminho do script auxiliar simplessrc_path
: que contém alguns arquivos de modelo aguardando para serem copiados.cwd
: diretório atual , o destino desses arquivos de modelo.e o problema é: não temos o caminho completo
src_path
, apenas sabemos que é um caminho relativo para omod_path
.Agora vamos resolver isso com o incrível
pathlib
:No futuro, é simples assim. : D
Além disso, podemos selecionar e verificar e copiar / mover esses arquivos de modelo com
pathlib
:fonte
Considere o meu código:
fonte
Consulte sys.path Como inicializado na inicialização do programa, o primeiro item desta lista, caminho [0], é o diretório que contém o script usado para chamar o interpretador Python.
Use esse caminho como a pasta raiz da qual você aplica o caminho relativo
fonte
sys.path[0]
nem sempre é definido como o diretório pai. O código Python pode ser invocado com-c
ou-m
através de um intérprete incorporado, quando o pontosys.path[0]
é definido como algo completamente diferente.Ao invés de usar
como na resposta aceita, seria mais robusto usar:
porque usar __file__ retornará o arquivo do qual o módulo foi carregado, se foi carregado de um arquivo; portanto, se o arquivo com o script for chamado de outro lugar, o diretório retornado não estará correto.
Essas respostas fornecem mais detalhes: https://stackoverflow.com/a/31867043/5542253 e https://stackoverflow.com/a/50502/5542253
fonte
inspect.stack()
é uma função cara de chamar. Ele recupera informações para todos os quadros de pilha, que você descarta e obtém apenas o primeiro. Basicamente, chamainspect.getfile()
o objeto do módulo, que apenas retornamodule.__file__
. Você é muito melhor apenas usando__file__
.Olá, primeiro de tudo, você deve entender as funções os.path.abspath (path) e os.path.relpath (path)
Em resumo, os.path.abspath (path) faz um caminho relativo para o caminho absoluto . E se o caminho fornecido for um caminho absoluto, a função retornará o mesmo caminho.
da mesma forma os.path.relpath (path) faz um caminho absoluto para o caminho relativo . E se o caminho fornecido for um caminho relativo, a função retornará o mesmo caminho.
O exemplo abaixo pode permitir que você entenda o conceito acima corretamente :
suponha que eu tenho um arquivo input_file_list.txt que contém a lista de arquivos de entrada a serem processados pelo meu script python.
D: \ conc \ input1.dic
D: \ conc \ input2.dic
D: \ Copyioconc \ input_file_list.txt
Se você ver a estrutura da pasta acima, o arquivo input_file_list.txt está presente na pasta Copyofconc e os arquivos a serem processados pelo script python estão presentes na pasta conc
Mas o conteúdo do arquivo input_file_list.txt é como mostrado abaixo:
.. \ conc \ input1.dic
.. \ conc \ input2.dic
E o meu script python está presente no D: drive.
E o caminho relativo fornecido no arquivo input_file_list.txt é relativo ao caminho do arquivo input_file_list.txt .
Portanto, quando o script python executar o diretório de trabalho atual (use os.getcwd () para obter o caminho)
Como meu caminho relativo é relativo a input_file_list.txt , que é "D: \ Copyofconc" , tenho que alterar o diretório de trabalho atual para "D: \ Copyofconc" .
Então, eu tenho que usar os.chdir ('D: \ Copyofconc') , para que o diretório de trabalho atual seja "D: \ Copyofconc" .
Agora, para obter os arquivos input1.dic e input2.dic , lerei as linhas ".. \ conc \ input1.dic" e depois usarei o comando
input1_path = os.path.abspath ('.. \ conc \ input1.dic') (para alterar o caminho relativo para o caminho absoluto. Aqui como diretório de trabalho atual é "D: \ Copyofconc", o arquivo ". \ conc \ input1. dic "deve ser acessado em relação a" D: \ Copyofconc ")
portanto, input1_path deve ser "D: \ conc \ input1.dic"
fonte
Este código retornará o caminho absoluto para o script principal.
Isso funcionará mesmo em um módulo.
fonte
sys.modules['__main__'].__file__
.Uma alternativa que funciona para mim:
fonte
O que funcionou para mim está usando
sys.path.insert
. Então eu especifiquei o diretório que eu precisava ir. Por exemplo, eu só precisava subir um diretório.fonte
Não tenho certeza se isso se aplica a algumas das versões mais antigas, mas acredito que o Python 3.3 tenha suporte nativo ao caminho relativo.
Por exemplo, o código a seguir deve criar um arquivo de texto na mesma pasta que o script python:
(observe que não deve haver uma barra invertida ou direta no início se for um caminho relativo)
fonte