Estou tendo problemas para entender __file__
. Pelo que entendi, __file__
retorna o caminho absoluto a partir do qual o módulo foi carregado.
Estou tendo problemas para produzir isto: tenho um abc.py
com uma instrução print __file__
, executando a partir de /d/projects/
python abc.py
retornos abc.py
. correndo de /d/
retornos projects/abc.py
. Alguma razão para quê?
Respostas:
Da documentação :
Do tópico da lista de e-mails vinculado por @kindall em um comentário para a pergunta:
Para o resto, considere
sys.path
não incluir''
.Então, se você estiver fora da parte
sys.path
que contém o módulo, você obterá um caminho absoluto . Se você estiver dentro da partesys.path
que contém o módulo, obterá um caminho relativo .Se você carregar um módulo no diretório atual, eo diretório atual não está em
sys.path
, você vai ter um caminho absoluto.Se você carregar um módulo no diretório atual, e o diretório atual estiver dentro
sys.path
, você obterá um caminho relativo.fonte
sys.path
, você vai ter um caminho absoluto. Se você carregar um módulo no diretório atual, e o diretório atual estiver dentrosys.path
, você obterá um caminho relativo.sys.path
não inclui''
.__file__
é absoluto desde o Python 3.4 , exceto ao executar um script diretamente usando um caminho relativo:Não tenho certeza se isso resolve links simbólicos embora.
Exemplo de passagem de um caminho relativo:
fonte
Python 3.4.0 (default, Apr 11 2014, 13:05:11) [GCC 4.8.2] on linux
). E os links simbólicos não são resolvidos em meus testes.os.path.realpath(__file__)
a maneira correta de resolver links simbólicos?Exemplo simples tardio:
Em Python-2. *, A segunda chamada determina incorretamente o com
path.abspath(__file__)
base no diretório atual:Conforme observado por @techtonik, no Python 3.4+, isso funcionará bem, pois
__file__
retorna um caminho absoluto.fonte
__main__
módulo, onde__file__
pode ser um caminho relativo.Com a ajuda do e-mail do Guido fornecido por @kindall, podemos entender o processo de importação padrão como tentar encontrar o módulo em cada membro de
sys.path
, e arquivo como resultado desta consulta (mais detalhes em Módulos PyMOTW e Importações .). Portanto, se o módulo está localizado em um caminho absoluto,sys.path
o resultado é absoluto, mas se ele está localizado em um caminho relativo,sys.path
o resultado é relativo.Agora, o
site.py
arquivo de inicialização se encarrega de entregar apenas o caminho absolutosys.path
, exceto o inicial''
, então se você não alterá-lo por outro meio que não seja definindo o PYTHONPATH (cujo caminho também é feito absoluto, antes de prefixarsys.path
), você obterá sempre um absoluto caminho, mas quando o módulo é acessado através do diretório atual.Agora, se você enganar o sys.path de uma maneira engraçada, poderá conseguir qualquer coisa.
Como exemplo, se você tem um módulo de exemplo
foo.py
no/tmp/
com o código:Se você entrar em / tmp, obterá:
Quando em
/home/user
, se você adicionar/tmp
seu,PYTHONPATH
você terá:Mesmo se você adicionar
../../tmp
, ele será normalizado e o resultado será o mesmo.Mas se em vez de usar
PYTHONPATH
você usar diretamente algum caminho engraçado você obtém um resultado tão engraçado quanto a causa.Guido explica no tópico citado acima, por que o python não tenta transformar todas as entradas em caminhos absolutos:
Portanto, seu caminho é usado como está .
fonte